Delen via


Een Java UDF gebruiken met Apache Hive in HDInsight

Meer informatie over het maken van een op Java gebaseerde door de gebruiker gedefinieerde functie (UDF) die werkt met Apache Hive. De Java UDF in dit voorbeeld converteert een tabel met teksttekenreeksen naar kleine letters.

Vereisten

  • Een Hadoop-cluster in HDInsight. Zie Aan de slag met HDInsight in Linux.

  • Java Developer Kit (JDK) versie 8

  • Apache Maven correct geïnstalleerd volgens Apache. Maven is een systeem voor het bouwen van Java-projecten.

  • Het URI-schema voor de primaire opslag voor uw clusters. Dit is wasb:// voor Azure Storage, abfs:// voor Azure Data Lake Storage Gen2 of adl:// voor Azure Data Lake Storage Gen1. Als beveiligde overdracht is ingeschakeld voor Azure Storage, wordt de URI wasbs://. Zie ook beveiligde overdracht.

  • Een teksteditor of Java IDE

    Belangrijk

    Als u de Python-bestanden op een Windows-client maakt, moet u een editor gebruiken die LF als regeleinde gebruikt. Als u niet zeker weet of uw editor LF of CRLF gebruikt, raadpleegt u de sectie Probleemoplossing voor stappen voor het verwijderen van het CR-teken.

Testomgeving

De omgeving die voor dit artikel wordt gebruikt, was een computer met Windows 10. De opdrachten zijn uitgevoerd in een opdrachtprompt en de verschillende bestanden zijn bewerkt met Kladblok. Wijzig dienovereenkomstig voor uw omgeving.

Voer vanaf een opdrachtprompt de onderstaande opdrachten in om een werkomgeving te maken:

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

Een voorbeeld van een Java UDF maken

  1. Maak een nieuw Maven-project door de volgende opdracht in te voeren:

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

    Met deze opdracht maakt u een map met de naam exampleudf, die het Maven-project bevat.

  2. Nadat het project is gemaakt, verwijdert u de exampleudf/src/test map die is gemaakt als onderdeel van het project door de volgende opdracht in te voeren:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Open pom.xml door de onderstaande opdracht in te voeren:

    notepad pom.xml
    

    Vervang vervolgens de bestaande <dependencies> vermelding door de volgende 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>
    

    Deze vermeldingen geven de versie van Hadoop en Hive op die zijn opgenomen in HDInsight 3.6. U vindt informatie over de versies van Hadoop en Hive met HDInsight in het versiebeheerdocument voor HDInsight-onderdelen.

    Voeg een <build> sectie toe vóór de </project> regel aan het einde van het bestand. Deze sectie moet de volgende XML bevatten:

    <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>
    

    Deze vermeldingen definiëren hoe het project moet worden gebouwd. De versie van Java die door het project wordt gebruikt en hoe u een uberjar bouwt voor implementatie in het cluster.

    Sla het bestand op zodra de wijzigingen zijn aangebracht.

  4. Voer de onderstaande opdracht in om een nieuw bestand ExampleUDF.javate maken en te openen:

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

    Kopieer en plak de Onderstaande Java-code in het nieuwe bestand. Sluit vervolgens het bestand.

    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();
        }
    }
    

    Met deze code wordt een UDF geïmplementeerd die een tekenreekswaarde accepteert en een kleine versie van de tekenreeks retourneert.

De UDF bouwen en installeren

Vervang in de onderstaande opdrachten door sshuser de werkelijke gebruikersnaam, indien anders. Vervang door mycluster de werkelijke clusternaam.

  1. Compileer de UDF en pak deze in door de volgende opdracht in te voeren:

    mvn compile package
    

    Met deze opdracht wordt de UDF in het exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar bestand gebouwd en verpakt.

  2. Gebruik de scp opdracht om het bestand naar het HDInsight-cluster te kopiëren door de volgende opdracht in te voeren:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Maak verbinding met het cluster met behulp van SSH door de volgende opdracht in te voeren:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. Kopieer vanuit de geopende SSH-sessie het JAR-bestand naar HDInsight-opslag.

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

De UDF van Hive gebruiken

  1. Start de Beeline-client vanuit de SSH-sessie door de volgende opdracht in te voeren:

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

    Bij deze opdracht wordt ervan uitgegaan dat u de standaardbeheerder hebt gebruikt voor het aanmeldingsaccount voor uw cluster.

  2. Wanneer u bij de jdbc:hive2://localhost:10001/> prompt aankomt, voert u het volgende in om de UDF toe te voegen aan Hive en deze beschikbaar te maken als een functie.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Gebruik de UDF om waarden te converteren die zijn opgehaald uit een tabel naar tekenreeksen met kleine letters.

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

    Met deze query selecteert u de status in de tabel, converteert u de tekenreeks naar kleine letters en geeft u deze samen met de ongewijzigde naam weer. De uitvoer lijkt op de volgende tekst:

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

Probleemoplossing

Wanneer u de hive-taak uitvoert, treedt er mogelijk een fout op die vergelijkbaar is met de volgende tekst:

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.

Dit probleem kan worden veroorzaakt door de regeleinden in het Python-bestand. Veel Windows-editors gebruiken CRLF standaard als het einde van de regel, maar Linux-toepassingen verwachten meestal LF.

U kunt de volgende PowerShell-instructies gebruiken om de CR-tekens te verwijderen voordat u het bestand uploadt naar 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)

Volgende stappen

Zie Apache Hive gebruiken met HDInsight voor andere manieren om met Hive te werken.

Zie de sectie Apache Hive Operators en door de gebruiker gedefinieerde functies van Hive op apache.org voor meer informatie over door de gebruiker gedefinieerde Hive-functies .