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 alleen 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 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 werd gebruikt, was een computer met Windows 10. De opdrachten werden 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 die bij HDInsight worden geleverd in het document over versiebeheer van 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>
Met deze vermeldingen wordt gedefinieerd hoe het project wordt gebouwd. Met name de versie van Java die het project 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 vervolgens 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(); } }
Deze code implementeert een UDF die een tekenreekswaarde accepteert en retourneert een kleine versie van de tekenreeks.
De UDF bouwen en installeren
Vervang in de onderstaande opdrachten door sshuser
de werkelijke gebruikersnaam, indien verschillend. Vervang door mycluster
de werkelijke clusternaam.
Compileer en verpak de UDF 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 het JAR-bestand vanuit de geopende SSH-sessie naar de 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 standaardinstelling beheerder hebt gebruikt voor het aanmeldingsaccount voor uw cluster.
Zodra u bij de
jdbc:hive2://localhost:10001/>
prompt bent aangekomen, 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 die zijn opgehaald uit een tabel te converteren naar tekenreeksen met kleine letters.
SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
Deze query selecteert de status in de tabel, converteert de tekenreeks naar kleine letters en geeft deze vervolgens weer samen met de ongewijzigde naam. 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 | +---------------+---------------+--+
Problemen oplossen
Wanneer u de Hive-taak uitvoert, kan er een fout optreden 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 User-Defined Functions van de Hiv User-Defined e-wiki op apache.org voor meer informatie over Hive-functies.