Utilizar um UDF java com o Apache Hive no HDInsight
Saiba como criar uma função definida pelo utilizador (UDF) baseada em Java que funcione com o Apache Hive. O UDF de Java neste exemplo converte uma tabela de cadeias de texto em carateres em minúsculas.
Pré-requisitos
Um cluster do Hadoop no HDInsight. Consulte Introdução ao HDInsight no Linux.
O Apache Maven foi instalado corretamente de acordo com o Apache. O Maven é um sistema de compilação de projetos para projetos Java.
O esquema de URI para o armazenamento primário dos clusters. Isto seria wasb:// para o Armazenamento do Azure, abfs:// para Azure Data Lake Storage Gen2 ou adl:// para o Azure Data Lake Storage Gen1. Se a transferência segura estiver ativada para o Armazenamento do Azure, o URI será
wasbs://
. Veja também Transferência segura.Um editor de texto ou IDE Java
Importante
Se criar os ficheiros Python num cliente Windows, tem de utilizar um editor que utilize o LF como uma linha que termine. Se não tiver a certeza se o editor utiliza LF ou CRLF, veja a secção Resolução de problemas para obter os passos sobre como remover o caráter CR.
Ambiente de teste
O ambiente utilizado para este artigo era um computador com Windows 10. Os comandos foram executados numa linha de comandos e os vários ficheiros foram editados com o Bloco de Notas. Modifique em conformidade para o seu ambiente.
Numa linha de comandos, introduza os comandos abaixo para criar um ambiente de trabalho:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Criar um exemplo de UDF java
Crie um novo projeto maven ao introduzir o seguinte comando:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=ExampleUDF -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Este comando cria um diretório com o nome
exampleudf
, que contém o projeto Maven.Assim que o projeto tiver sido criado, elimine o
exampleudf/src/test
diretório que foi criado como parte do projeto ao introduzir o seguinte comando:cd ExampleUDF rmdir /S /Q "src/test"
Abra
pom.xml
ao introduzir o comando abaixo:notepad pom.xml
Em seguida, substitua a entrada existente
<dependencies>
pelo seguinte 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>
Estas entradas especificam a versão do Hadoop e do Hive incluída no HDInsight 3.6. Pode encontrar informações sobre as versões do Hadoop e do Hive fornecidas com o HDInsight a partir do documento de controlo de versões de componentes do HDInsight .
Adicione uma
<build>
secção antes da</project>
linha no final do ficheiro. Esta secção deve conter o seguinte 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>
Estas entradas definem como criar o projeto. Especificamente, a versão do Java que o projeto utiliza e como criar um uberjar para implementação no cluster.
Guarde o ficheiro assim que as alterações tiverem sido efetuadas.
Introduza o comando abaixo para criar e abrir um novo ficheiro
ExampleUDF.java
:notepad src/main/java/com/microsoft/examples/ExampleUDF.java
Em seguida, copie e cole o código Java abaixo no novo ficheiro. Em seguida, feche o ficheiro.
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(); } }
Este código implementa um UDF que aceita um valor de cadeia e devolve uma versão minúscula da cadeia.
Criar e instalar o UDF
Nos comandos abaixo, substitua sshuser
pelo nome de utilizador real, se diferente. Substitua pelo mycluster
nome do cluster real.
Compile e empacote o UDF ao introduzir o seguinte comando:
mvn compile package
Este comando cria e empacota o UDF no
exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar
ficheiro.Utilize o
scp
comando para copiar o ficheiro para o cluster do HDInsight ao introduzir o seguinte comando:scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
Ligue-se ao cluster através de SSH ao introduzir o seguinte comando:
ssh sshuser@mycluster-ssh.azurehdinsight.net
Na sessão SSH aberta, copie o ficheiro jar para o armazenamento do HDInsight.
hdfs dfs -put ExampleUDF-1.0-SNAPSHOT.jar /example/jars
Utilizar a UDF do Hive
Inicie o cliente Beeline a partir da sessão SSH ao introduzir o seguinte comando:
beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
Este comando pressupõe que utilizou a predefinição de administrador para a conta de início de sessão do cluster.
Assim que chegar à
jdbc:hive2://localhost:10001/>
linha de comandos, introduza o seguinte para adicionar o UDF ao Hive e expô-lo como uma função.ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar; CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
Utilize o UDF para converter valores obtidos de uma tabela em cadeias minúsculas.
SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
Esta consulta seleciona o estado da tabela, converte a cadeia em minúsculas e, em seguida, apresenta-as juntamente com o nome não modificado. O resultado é semelhante ao seguinte texto:
+---------------+---------------+--+ | exampleudf | state | +---------------+---------------+--+ | california | California | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | colorado | Colorado | | colorado | Colorado | | colorado | Colorado | | utah | Utah | | utah | Utah | | colorado | Colorado | +---------------+---------------+--+
Resolução de problemas
Ao executar a tarefa do ramo de registo, poderá deparar-se com um erro semelhante ao seguinte texto:
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.
Este problema pode ser causado pelas terminações de linha no ficheiro Python. Muitos editores do Windows utilizam CRLF como a linha que termina, mas as aplicações linux normalmente esperam LF.
Pode utilizar as seguintes instruções do PowerShell para remover os carateres CR antes de carregar o ficheiro para o 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)
Passos seguintes
Para outras formas de trabalhar com o Hive, veja Utilizar o Apache Hive com o HDInsight.
Para obter mais informações sobre as Funções de User-Defined do Hive, veja a secção Operadores do Apache Hive e Funções de User-Defined do wiki do Hive em apache.org.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários