Dela via


Använda en Java UDF med Apache Hive i HDInsight

Lär dig hur du skapar en Java-baserad användardefinierad funktion (UDF) som fungerar med Apache Hive. Java UDF i det här exemplet konverterar en tabell med textsträngar till gemener.

Förutsättningar

  • Ett Hadoop-kluster i HDInsight. Se Komma igång med HDInsight i Linux.

  • Java Developer Kit (JDK) version 8

  • Apache Maven har installerats korrekt enligt Apache. Maven är ett projektbyggsystem för Java-projekt.

  • URI-schemat för dina klusters primära lagring. Detta skulle vara wasb:// för Azure Storage, abfs:// för Azure Data Lake Storage Gen2 eller adl:// för Azure Data Lake Storage Gen1. Om säker överföring är aktiverad för Azure Storage blir wasbs://URI:n . Se även säker överföring.

  • En textredigerare eller Java IDE

    Viktigt!

    Om du skapar Python-filerna på en Windows-klient måste du använda en redigerare som använder LF som radslut. Om du inte är säker på om redigeraren använder LF eller CRLF kan du läsa felsökningsavsnittet om hur du tar bort CR-tecknet.

Testmiljö

Miljön som används för den här artikeln var en dator som kör Windows 10. Kommandona kördes i en kommandotolk och de olika filerna redigerades med Anteckningar. Ändra i enlighet med detta för din miljö.

Från en kommandotolk anger du kommandona nedan för att skapa en arbetsmiljö:

IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI

Skapa ett exempel på Java UDF

  1. Skapa ett nytt Maven-projekt genom att ange följande kommando:

    mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=ExampleUDF -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    

    Det här kommandot skapar en katalog med namnet exampleudf, som innehåller Maven-projektet.

  2. När projektet har skapats tar du bort katalogen exampleudf/src/test som skapades som en del av projektet genom att ange följande kommando:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Öppna pom.xml genom att ange kommandot nedan:

    notepad pom.xml
    

    Ersätt sedan den befintliga <dependencies> posten med följande XML:

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>1.2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    

    Dessa poster anger vilken version av Hadoop och Hive som ingår i HDInsight 3.6. Du hittar information om versionerna av Hadoop och Hive som tillhandahålls med HDInsight från dokumentet om versionshantering av HDInsight-komponenter.

    Lägg till ett <build> avsnitt före </project> raden i slutet av filen. Det här avsnittet ska innehålla följande XML:

    <build>
        <plugins>
            <!-- build for Java 1.8. This is required by HDInsight 3.6  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- build an uber jar -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <configuration>
                    <!-- Keep us from getting a can't overwrite file error -->
                    <transformers>
                        <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
                        </transformer>
                    </transformers>
                    <!-- Keep us from getting a bad signature error -->
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    De här posterna definierar hur du skapar projektet. Mer specifikt den version av Java som projektet använder och hur du skapar en uberjar för distribution till klustret.

    Spara filen när ändringarna har gjorts.

  4. Ange kommandot nedan för att skapa och öppna en ny fil ExampleUDF.java:

    notepad src/main/java/com/microsoft/examples/ExampleUDF.java
    

    Kopiera och klistra sedan in Java-koden nedan i den nya filen. Stäng sedan filen.

    package com.microsoft.examples;
    
    import org.apache.hadoop.hive.ql.exec.Description;
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.*;
    
    // Description of the UDF
    @Description(
        name="ExampleUDF",
        value="returns a lower case version of the input string.",
        extended="select ExampleUDF(deviceplatform) from hivesampletable limit 10;"
    )
    public class ExampleUDF extends UDF {
        // Accept a string input
        public String evaluate(String input) {
            // If the value is null, return a null
            if(input == null)
                return null;
            // Lowercase the input string and return it
            return input.toLowerCase();
        }
    }
    

    Den här koden implementerar en UDF som accepterar ett strängvärde och returnerar en gemen version av strängen.

Skapa och installera UDF

I kommandona nedan ersätter du sshuser med det faktiska användarnamnet om det skiljer sig. Ersätt mycluster med det faktiska klusternamnet.

  1. Kompilera och paketera UDF genom att ange följande kommando:

    mvn compile package
    

    Det här kommandot bygger och paketer UDF i exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar filen.

  2. scp Använd kommandot för att kopiera filen till HDInsight-klustret genom att ange följande kommando:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Anslut till klustret med hjälp av SSH genom att ange följande kommando:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. Från den öppna SSH-sessionen kopierar du jar-filen till HDInsight Storage.

    hdfs dfs -put ExampleUDF-1.0-SNAPSHOT.jar /example/jars
    

Använda UDF från Hive

  1. Starta Beeline-klienten från SSH-sessionen genom att ange följande kommando:

    beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
    

    Det här kommandot förutsätter att du använde administratörsstandarden för inloggningskontot för klustret.

  2. När du kommer till prompten jdbc:hive2://localhost:10001/> anger du följande för att lägga till UDF i Hive och exponera den som en funktion.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Använd UDF för att konvertera värden som hämtats från en tabell till gemener.

    SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
    

    Den här frågan väljer tillståndet från tabellen, konverterar strängen till gemener och visar dem sedan tillsammans med det oförändrade namnet. Utdata ser ut ungefär som i följande text:

    +---------------+---------------+--+
    |  exampleudf   |     state     |
    +---------------+---------------+--+
    | california    | California    |
    | pennsylvania  | Pennsylvania  |
    | pennsylvania  | Pennsylvania  |
    | pennsylvania  | Pennsylvania  |
    | colorado      | Colorado      |
    | colorado      | Colorado      |
    | colorado      | Colorado      |
    | utah          | Utah          |
    | utah          | Utah          |
    | colorado      | Colorado      |
    +---------------+---------------+--+
    

Felsökning

När du kör hive-jobbet kan du stöta på ett fel som liknar följande text:

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: [Error 20001]: An error occurred while reading or writing to your custom script. It may have crashed with an error.

Det här problemet kan orsakas av radsluten i Python-filen. Många Windows-redigerare använder som standard CRLF som radslut, men Linux-program förväntar sig vanligtvis LF.

Du kan använda följande PowerShell-instruktioner för att ta bort CR-tecknen innan du laddar upp filen till HDInsight:

# Set $original_file to the Python file path
$text = [IO.File]::ReadAllText($original_file) -replace "`r`n", "`n"
[IO.File]::WriteAllText($original_file, $text)

Nästa steg

Andra sätt att arbeta med Hive finns i Använda Apache Hive med HDInsight.

Mer information om Användardefinierade Hive-funktioner finns i avsnittet Apache Hive-operatorer och användardefinierade funktioner i Hive-wikin på apache.org.