Исключительно простое исключение из пользовательского интерфейса UDF - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть следующий исходный код пользовательского UDF Hive, он отлично работает: -

package com.mycompany.strings;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.io.Text;


public class Testudf extends UDF
{ 
    public Text evaluate(Text inputstring)
    {   
        return new Text(inputstring.toString().toLowerCase());
    }
}

Этот UDF преобразует строку в нижний регистр.Я проверил его, вызвав против него функцию в улье, и он возвращает ожидаемый результат, как и ожидалось.Следующий запрос улья возвращает строчные буквы: -

select myfunction(somestringcolumn) from sometable limit 10;

Я внес некоторые изменения в основной код следующим образом: -

    package com.mycompany.strings;
    import com.jayway.jsonpath.DocumentContext;
    import com.jayway.jsonpath.JsonPath;
    import org.apache.hadoop.hive.ql.exec.UDF; 
    import org.apache.hadoop.io.Text;


    public class Testudf extends UDF
    { 
        public Text evaluate(Text inputstring) // input is purposely not even used
        {   
          String myjson="{ \"name\":\"jack\", \"city\":\"london\" }";
          JsonPath.parse(myjson);   // this line seems to be causing the issue      
          return new Text("hello"); // hard coded return on purpose
        }
    }

Как видите, код очень прост.Входное значение не играет никакой роли, выходное значение просто жестко закодировано, чтобы исключить любые проблемы, вызванные его вычислением.Кроме того, используемая функция синтаксического анализа json также использует жестко закодированное значение в качестве входных данных.Несмотря на все это, когда я запускаю против него функцию в улье, я получаю следующее исключение: -

select myfunction(somestringcolumn) from sometable limit 10;
Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public org.apache.hadoop.io.Text com.mycompany.strings.Testudf.evaluate(org.apache.hadoop.io.Text)  on object com.mycompany.strings.Testudf@40d96578 of class com.mycompany.strings.Testudf with arguments {Unknown:org.apache.hadoop.io.Text} of size 1

Как решить это?Вероятно, это связано с проблемой ссылки на библиотеку для пакета com.jayway.jsonpath, потому что только когда она ссылается на JsonPath.parse, это создает эту проблему, даже если я даже не использую вывод JsonPath.parse в своем возвращаемом значении.Возвращаемое значение само по себе жестко закодировано.

Я строю банку, используя maven.Вот мой pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.mycompany.strings</groupId>
      <artifactId>testudf</artifactId>
      <packaging>jar</packaging>
      <version>1.0</version>

      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      </properties>

    <repositories>
        <repository>
         <releases>
          <enabled>true</enabled>
         </releases>
         <snapshots>
          <enabled>true</enabled>
         </snapshots>
         <id>hortonworks.extrepo</id>
         <name>Hortonworks HDP</name>
         <url>http://repo.hortonworks.com/content/repositories/releases</url>
        </repository>
       <repository>
         <releases>
          <enabled>true</enabled>
         </releases>
         <snapshots>
          <enabled>true</enabled>
         </snapshots>
         <id>hortonworks.other</id>
         <name>Hortonworks Other Dependencies</name>
         <url>http://repo.hortonworks.com/content/groups/public</url>
        </repository>
    </repositories> 

      <dependencies>
          <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>2.4.0</version>
          </dependency>
          <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>1.2.1000.2.6.4.0-91</version>
          </dependency>
          <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-core</artifactId>
            <version>0.20.2</version>
          </dependency>
      </dependencies>


      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <configuration>
              <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>

Кажется, Maven генерирует 2 файла: original-testudf-1.0.jar (размером 4 КБ), а также testudf-1.0.jar (размером более 100 МБ)и я использую уменьшенную версию, то есть original-testudf-1.0.jar.

...