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 Kom igång med HDInsight i Linux.

  • Java Developer Kit (JDK) version 8

  • Apache Mavenhar 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 aktiverat för Azure Storage är 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ö.

I 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. Information om versionerna av Hadoop och Hive finns i HDInsight-komponentens versionsdokument .

    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 är annorlunda. 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 skapar och paketar 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. Kopiera jar-filen till HDInsight Storage från den öppna SSH-sessionen.

    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 standardinställningen administratör 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 omodifierade 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 bero på 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 Hive User-Defined Functions finns i avsnittet Apache Hive Operators and User-Defined Functions (Apache Hive-operatorer och User-Defined Functions ) i Hive-wikin på apache.org.