Použití UDF v Javě s Apache Hivem ve službě HDInsight
Zjistěte, jak vytvořit uživatelem definovanou funkci (UDF) založenou na Javě, která funguje s Apache Hivem. UDF v Javě v tomto příkladu převede tabulku textových řetězců na všechna malá písmena.
Požadavky
Cluster Hadoop ve službě HDInsight. Viz Začínáme se službou HDInsight v Linuxu.
Apache Maven je správně nainstalovaný podle Apache. Maven je systém sestavování projektů pro projekty Java.
Schéma identifikátoru URI pro primární úložiště clusterů. To by bylo wasb:// pro Azure Storage, abfs:// pro Azure Data Lake Storage Gen2 nebo adl:// pro Azure Data Lake Storage Gen1. Pokud je pro Azure Storage povolený zabezpečený přenos, identifikátor URI bude
wasbs://
. Viz také zabezpečený přenos.Textový editor nebo java integrované vývojové prostředí (IDE)
Důležité
Pokud vytváříte soubory Pythonu na klientovi Windows, musíte použít editor, který jako konec řádku používá LF. Pokud si nejste jistí, jestli váš editor používá LF nebo CRLF, přečtěte si část Řešení potíží, kde najdete postup odebrání znaku CR.
Testovací prostředí
Prostředím použitým v tomto článku byl počítač, na kterém běží Windows 10. Příkazy se spustily na příkazovém řádku a různé soubory byly upraveny pomocí Poznámkového bloku. Upravte odpovídajícím způsobem pro vaše prostředí.
Z příkazového řádku zadejte následující příkazy a vytvořte pracovní prostředí:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Vytvoření ukázky UDF v Javě
Zadáním následujícího příkazu vytvořte nový projekt Maven:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=ExampleUDF -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Tento příkaz vytvoří adresář s názvem
exampleudf
, který obsahuje projekt Maven.Po vytvoření projektu odstraňte
exampleudf/src/test
adresář vytvořený jako součást projektu zadáním následujícího příkazu:cd ExampleUDF rmdir /S /Q "src/test"
Otevřete
pom.xml
zadáním následujícího příkazu:notepad pom.xml
Pak nahraďte existující
<dependencies>
položku následujícím kódem 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>
Tyto položky určují verzi Hadoopu a Hive, která je součástí HDInsight 3.6. Informace o verzích Hadoop a Hive poskytovaných se službou HDInsight najdete v dokumentu o správě verzí komponent HDInsight .
<build>
Přidejte oddíl před</project>
řádek na konci souboru. Tato část by měla obsahovat následující kód 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>
Tyto položky definují způsob sestavení projektu. Konkrétně verze Javy, kterou projekt používá, a postup vytvoření uberjaru pro nasazení do clusteru.
Po provedení změn soubor uložte.
Zadáním následujícího příkazu vytvořte a otevřete nový soubor
ExampleUDF.java
:notepad src/main/java/com/microsoft/examples/ExampleUDF.java
Pak zkopírujte níže uvedený kód Java a vložte ho do nového souboru. Pak soubor zavřete.
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(); } }
Tento kód implementuje UDF, který přijímá řetězcovou hodnotu a vrací verzi řetězce s malými písmeny.
Sestavení a instalace uživatelem definovaného uživatelem
V následujících příkazech nahraďte sshuser
skutečným uživatelským jménem, pokud se liší. Nahraďte mycluster
skutečným názvem clusteru.
Zkompilujte a zabalte UDF zadáním následujícího příkazu:
mvn compile package
Tento příkaz sestaví ADF a zabalí ho do
exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar
souboru.Pomocí příkazu
scp
zkopírujte soubor do clusteru HDInsight zadáním následujícího příkazu:scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
Připojte se ke clusteru pomocí SSH zadáním následujícího příkazu:
ssh sshuser@mycluster-ssh.azurehdinsight.net
Z otevřené relace SSH zkopírujte soubor JAR do úložiště HDInsight.
hdfs dfs -put ExampleUDF-1.0-SNAPSHOT.jar /example/jars
Použití UDF z Hivu
Zadáním následujícího příkazu spusťte klienta Beeline z relace SSH:
beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
Tento příkaz předpokládá, že jste pro přihlašovací účet clusteru použili výchozí hodnotu admin .
Jakmile se zobrazí
jdbc:hive2://localhost:10001/>
výzva, zadejte následující příkaz, který přidá uživatelem definované uživatelem do Hivu a zveřejní ho jako funkci.ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar; CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
Pomocí funkce UDF můžete převést hodnoty načtené z tabulky na řetězce s velkými písmeny.
SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
Tento dotaz vybere stav z tabulky, převede řetězec na malá písmena a pak je zobrazí spolu s neupraveným názvem. Výstup se bude podobat následujícímu textu:
+---------------+---------------+--+ | exampleudf | state | +---------------+---------------+--+ | california | California | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | colorado | Colorado | | colorado | Colorado | | colorado | Colorado | | utah | Utah | | utah | Utah | | colorado | Colorado | +---------------+---------------+--+
Řešení potíží
Při spuštění úlohy Hive můžete narazit na chybu podobnou následujícímu textu:
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.
Příčinou tohoto problému mohou být konce řádků v souboru Pythonu. Mnoho editorů windows ve výchozím nastavení jako konec řádku používá CRLF, ale linuxové aplikace obvykle očekávají LF.
Před nahráním souboru do HDInsight můžete pomocí následujících příkazů PowerShellu odebrat znaky CR:
# Set $original_file to the Python file path
$text = [IO.File]::ReadAllText($original_file) -replace "`r`n", "`n"
[IO.File]::WriteAllText($original_file, $text)
Další kroky
Další způsoby práce s Hivem najdete v tématu Použití Apache Hivu se službou HDInsight.
Další informace o funkcích Hive User-Defined najdete v části Apache Hive Operators and User-Defined Functions na wikiwebu Hive na apache.org.