在 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 时如何查询多个列?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 在 HIVE 中创建 UDF 进行时间戳转换
如何使用 python 和 3rd 方包(如 sklearn)为 hive 创建一个 udf?