如何在Hive中为用户定义的聚合函数编写Python UDF

时间:2014-12-09 23:47:56

标签: python hive

我想在Hive中使用Python对聚合列(在GROUP BY之后)进行一些聚合工作。我发现有UDAF用于此目的。我能找到的只是一个Java示例。有没有关于用Python编写的例子?

或者对于UDF和UDAF之间的python,没有区别?对于UDAF,我只需要像减速器一样编写它?请指教。

1 个答案:

答案 0 :(得分:2)

您可以使用Hive的流式UDF功能(TRANSFORM)来使用从stdin读取并输出到stdout的Python UDF。你还没有找到任何Python" UDAF"示例,因为UDAF指的是您扩展的Hive Java类,因此它只能在Java中。

使用流式UDF时,Hive将选择是启动还是映射或减少作业,因此无需指定(有关此功能的更多信息,请参阅此链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Transform)。

基本上,你的实现是编写一个从stdin读取的python脚本,计算一些聚合数并将其输出到stdout。要在Hive中实现,请执行以下操作:

1)首先将您的python脚本添加到Hive中的资源库,以便它在整个集群中分布:

add file script.py;

2)然后调用转换函数并输入要聚合的列。这是一个例子:

select transform(input cols)
using 'python script.py' as (output cols)
from table
;

根据您的需要,您可能需要单独的映射器和缩减器脚本。如果需要根据列值进行聚合,请记住在映射器阶段使用Hive的CLUSTER BY / DISTRIBUTE BY语法,以便将分区数据发送到reducer。

如果有帮助,请告诉我。