在 hive 中使用 python udf 时如何查询多个列?

Posted

技术标签:

【中文标题】在 hive 中使用 python udf 时如何查询多个列?【英文标题】:How to query multiple columns when using a python udf in hive? 【发布时间】:2015-08-12 08:46:28 【问题描述】:

我正在尝试执行此查询:

add FILE /home/user1/test/test_udf.py;

SELECT a.hash_code, col2
FROM (SELECT transform (col2, col3) using 'python test_udf.py' as hash_code, col2
      FROM sample_table) a ;

我能够使用 udf 成功生成 hash_code,但另一列 (col2) 被填充为 NULL

样本输出

sjhfshhalksjlkfj128798172jasjhas   NULL
ajsdlkja982988290819189089089889   NULL
jhsad817982mnsandkjsahj982398290   NULL

【问题讨论】:

SELECT a.hash_code, a.col2 from (select transform (col2,col3) using 'python test_udf.py' as hash_code, col2 from sample_table) a ;也给出了相同的结果 真值是NULL吗? 不,我在“col2”列中有有效值 试试SELECT a.hash_code, a.col2 from (select col2, transform (col2,col3) using 'python test_udf.py' as hash_codefrom sample_table) a? 对于上述查询,我​​的查询失败,“无法在选择表达式中识别 'transform' '(' 'package_id' 附近的输入。我将原始查询粘贴在这里供您参考。SELECT a.hash_code ,a.package_id from (select package_id, transform (package_id,file_name,system) using 'python md5hash_conv_udf.py' as hash_code from raw_pharm_pbm.audit_table) a ; 【参考方案1】:

我知道你的 HiveSql 出了什么问题。

transform (col2, col3) using 'python test_udf.py' as hash_code, col2 FROM sample_table 中,hash_code, col2 的值是从transform (col2, col3) 的返回值中解析出来的。

clo2 是从transform (col2, col3) 解析出来的,即NULL

我看了Transform doc,得到的相关信息如下。

变换/Map-Reduce 语法

SELECT TRANSFORM '(' expression (',' expression)* ')'
  (inRowFormat)?
  USING 'my_reduce_script'
  ( AS colName (',' colName)* )?
  (outRowFormat)? (outRecordReader)?

您最好不要将transform 与其他select 混合使用,因为语法不支持。

更新:

有一个技巧可以做你想做的事:让test_udf.py 返回hash_code\t col2。 所以你可以从中解析hash_code, col2。这将解决您的问题。

【讨论】:

您能否建议一种替代方法来选择多个列,并且对于其中一个列,我必须使用 python udf。比如“select transform(col1) using 'python udf.py' as msg, col2 from table;” 看起来它是唯一可用的解决方案。当我使用 java udf 时,我没有这些问题。我希望这个 udf 应该是通用的。如果我必须在具有不同列数的不同表上使用它,那将是一个挑战。

以上是关于在 hive 中使用 python udf 时如何查询多个列?的主要内容,如果未能解决你的问题,请参考以下文章

在 hive 中注册 python 自定义 UDF

如何使用 python 在 HIVE 中创建 UDF 进行时间戳转换

python写hive的UDF问题

如何使用 python 和 3rd 方包(如 sklearn)为 hive 创建一个 udf?

Spark(Hive) SQL中UDF的使用(Python)

Hive:python UDF 在关闭操作符时给出“Hive 运行时错误”