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

Posted

技术标签:

【中文标题】如何使用 Hive 上下文中的 Pyspark 调用用 Java 编写的 Hive UDF【英文标题】:How to call a hive UDF written in Java using Pyspark from Hive Context 【发布时间】:2016-07-20 21:53:02 【问题描述】:

我在 hive 中使用 getLastProcessedVal2 UDF 从表中获取最新的分区。此 UDF 是用 java 编写的。我想使用来自 pyspark 的相同 UDF 使用 hive 上下文。

dfsql_sel_nxt_batch_id_ini=sqlContext.sql(''' select l4_xxxx_seee.**getLastProcessedVal2**("/data/l4/work/hive/l4__stge/proctl_stg","APP_AMLMKTE_L1","L1_AMLMKT_MDWE","TRE_EXTION","2.1")''')

错误:

错误 exec.FunctionRegistry:无法加载 UDF 类: java.lang.ClassNotFoundException:

【问题讨论】:

【参考方案1】:

pyspark shell 启动为:

pyspark --jars /path/to.udf.jar <all-other-param>

使用--jars 选项提交您的 pyspark 作业:

spark-submit --jars /path/to/udf.jar <all-other-param>

【讨论】:

【参考方案2】:

您可以使用SQLContext 方法udf 注册该用户定义的函数,在那里您可以看到您必须传递一个字符串作为第一个参数,它将代表您使用udf 时的名称SQL查询。

例如

sqlContext.udf().register("slen",
       (String arg1) -> arg1.length(),
       DataTypes.IntegerType);

sqlContext.sql("SELECT slen(name) FROM user").show();

【讨论】:

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