Использование определяемых пользователем функций Java с Apache Hive в HDInsight

Узнайте, как создать определяемую пользователем функцию (UDF) на основе Java, которая работает с Apache Hive. Определяемая пользователем функция Java в этом примере преобразует таблицу текстовых строк в символы нижнего регистра.

Предварительные требования

Тестовая среда

Среда, использованная в этой статье, — компьютер под управлением Windows 10. Команды были выполнены в командной строке, а различные файлы были отредактированы в Блокноте. Внесите изменения в соответствии с особенностями своей среды.

В командной строке введите приведенные ниже команды, чтобы создать рабочую среду.

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

Создание примера определяемой пользователем функции Java

  1. Создайте проект Maven с помощью следующей команды:

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

    Эта команда создает каталог exampleudf, который содержит проект Maven.

  2. После создания проекта удалите каталог exampleudf/src/test, который был создан вместе с ним, с помощью следующей команды:

    cd ExampleUDF
    rmdir /S /Q "src/test"
    
  3. Откройте pom.xml, введя следующую команду:

    notepad pom.xml
    

    Замените запись <dependencies> следующим 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>
    

    В этих записях указана версия Hadoop и Hive, используемая в кластерах HDInsight 3.6. Сведения о версиях Hadoop и Hive, включенных в HDInsight, можно найти в статье Что представляют собой различные компоненты Hadoop, доступные в HDInsight? .

    В конце файла добавьте раздел <build> перед строкой </project>. Этот раздел должен содержать следующий код 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>
    

    Эти записи определяют способ построения проекта. В частности, используемую в проекте версию Java и способ построения uberjar для развертывания в кластер.

    После внесения изменений сохраните файл.

  4. Введите следующую команду, чтобы создать и открыть новый файл ExampleUDF.java:

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

    Затем скопируйте и вставьте приведенный ниже код Java в новый файл. После этого закройте файл.

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

    Этот код реализует определяемую пользователем функцию, которая принимает строковое значение и возвращает строку в нижнем регистре.

Создание и установка определяемой пользователем функции

В командах ниже вместо sshuser укажите реальное имя пользователя, если оно отличается. Вместо mycluster укажите реальное имя кластера.

  1. Cкомпилируйте и упакуйте определяемую пользователем функцию с помощью следующей команды:

    mvn compile package
    

    Эта команда выполняет сборку определяемой пользователем функции и упаковывает ее в файл exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar.

  2. Используйте команду scp, чтобы скопировать файл в кластер HDInsight:

    scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
    
  3. Подключитесь к кластеру по протоколу SSH с помощью следующей команды:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  4. В открытом сеансе SSH скопируйте JAR-файл в хранилище HDInsight.

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

Использование определяемой пользователем функции из Hive

  1. Запустите клиент Beeline из сеанса SSH с помощью следующей команды:

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

    В этой команде предполагается, что вы использовали для кластера учетную запись входа по умолчанию — admin .

  2. После появления командной строки jdbc:hive2://localhost:10001/> введите следующую команду, чтобы добавить определяемую пользователем функцию в Hive и предоставить ее как функцию.

    ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar;
    CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
    
  3. Используйте определяемую пользователем функцию, чтобы преобразовать значения, полученные из таблицы, в строки нижнего регистра.

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

    Этот запрос выбирает состояние из таблицы, преобразует строку в нижний регистр, а затем отображает ее вместе с исходным именем. Выходные данные выглядят следующим образом:

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

Устранение неполадок

При выполнении задания hive может возникнуть ошибка наподобие следующей:

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.

Эта проблема может быть вызвана символами окончания строк в файле Python. Многие редакторы Windows по умолчанию используют символы CRLF, но в приложениях Linux обычно ожидается использование символа LF.

Вы можете использовать следующие команды PowerShell для удаления символов CR перед передачей файла в 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)

Дальнейшие действия

Другие способы работы с Hive в HDInsight см. в этой статье.

Дополнительные сведения об определяемых пользователем функциях Hive см. в разделе Hive Operators and User-Defined Functions (Операторы Hive и определяемые пользователем функции) вики-сайта Hive на сайте apache.org.