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.
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 URIwasbs://
. 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
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.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"
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.
Voer de onderstaande opdracht in om een nieuw bestand
ExampleUDF.java
te 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.
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.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:
Maak verbinding met het cluster met behulp van SSH door de volgende opdracht in te voeren:
ssh sshuser@mycluster-ssh.azurehdinsight.net
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
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.
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';
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 .