使用 jRuby 编写 Hive UDF

Posted

技术标签:

【中文标题】使用 jRuby 编写 Hive UDF【英文标题】:Writing a Hive UDF using jRuby 【发布时间】:2013-04-22 23:26:24 【问题描述】:

可以吗?这是我尝试编写的测试 UDF:

java_package "com.foo.hive.udf"
java_import org.apache.hadoop.hive.ql.exec.Description
java_import org.apache.hadoop.hive.ql.exec.UDF

java_annotation 'Description(name = "foo", value = "_FUNC_(string) - just returns test.")'
class Foo < UDF
  def evaluate ts
    "test"
  end
end

然后我这样编译:

jrubyc com/foo/hive/udf/Foo.rb
jar -cf Foo.jar com/foo/hive/udf/*.class /path/to/jruby-1.7.3/lib/jruby.jar

然后我尝试使用它:

hive> ADD JAR path/to/Foo.jar;
Added /path/to/Foo.jar to class path
hive> CREATE TEMPORARY FUNCTION foo AS 'com.foo.hive.udf.Foo';

这给了我:

java.lang.NoClassDefFoundError: org/jruby/ast/executable/AbstractScript
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
  at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
  at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
  ...
FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.FunctionTask
hive> ADD JAR /path/to/Foo.jar;

同样的东西,用 java 写的,工作正常。所以这对我来说似乎是一个 jRuby 问题?

【问题讨论】:

【参考方案1】:

java.lang.NoClassDefFoundError: org/jruby/ast/executable/AbstractScript 告诉您 JRuby 运行时 jar 不可用。当您编译 JRuby 类时,它会创建一个 .class 文件,该文件取决于您编译它时使用的 JRuby 版本。

我猜如果你下载了 JRuby 完整的 jar,你可以运行

> ADD JAR jruby-complete-1.7.4.jar

然后您的类将配置其依赖项。

【讨论】:

以上是关于使用 jRuby 编写 Hive UDF的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hive 上下文中的 Pyspark 调用用 Java 编写的 Hive UDF

Hive入门--3.UDF编写与使用

Hive自定义UDF函数

hive 中简单的udf函数编写

使用Java继承UDF类或GenericUDF类给Hive3.1.2编写UDF实现编码解码加密解密并运行在USDP大数据集群

使用Java继承UDF类或GenericUDF类给Hive3.1.2编写UDF实现编码解码加密解密并运行在USDP大数据集群