Hive UDAF:将非 Java Hive UDAF 的输出转换为地图

Posted

技术标签:

【中文标题】Hive UDAF:将非 Java Hive UDAF 的输出转换为地图【英文标题】:Hive UDAF: Casting output of a non-Java Hive UDAF to a map 【发布时间】:2016-10-25 13:10:35 【问题描述】:

我正在试验用 Python 编写的 Hive UDAF,例如:

SELECT TRANSFORM(id, vtype, price) USING 'udaf.py' 
  AS (vtype STRING, stats MAP<STRING,FLOAT>)         
  FROM (SELECT * FROM foo CLUSTER BY vtype) AS TEMP_TABLE;

python 脚本写入 vtype 和一些统计信息,例如均值和方差,作为标准输出的字典,由工作正常的制表符分隔。我遇到的问题是我无法弄清楚我应该如何格式化定义统计映射的字段,以便 HiveQL 可以将其转换为查询中定义的 MAP。无论我尝试了什么,我在 stats 字段中都得到了类似的结果:

"mean:1.0,var:2.0":null

在上面的示例中,我尝试将其作为 JSON 字符串返回,HiveQL 将其解释为键并将 null 设置为值。彻底阅读 HiveQL 文档,我还尝试了“mean:1.0,var:2.0”、“MAP(mean:1.0,var:2.0)”、“mean:1.0,var:2.0”等,但没有任何效果。 Cloudera 上的 Hive 实际上有内置方法吗?

【问题讨论】:

【参考方案1】:

hive 表中映射的默认分隔符是映射键和映射值之间的'\003'(unicode 0x03)和集合元素之间的\002(unicode 0x02)(其中映射是键值对的集合) .

因此,在您的情况下,我会尝试使用

覆盖表格分隔符
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'

如果您在其他字段中有冒号逗号,这可能会带来风险。

或者您可以尝试使用默认分隔符输出地图。

如果这不起作用,您可以从 UDAF 获取字符串并使用

将其转换为地图

str_to_map(text, ',', ':')

【讨论】:

所以在 Python 脚本中输出 'mean\x031.0\x02variance\x032.0' 有效!谢谢你。还应该提到str_to_map 仅适用于map &lt;STRING, STRING&gt;,因此没有浮动键。

以上是关于Hive UDAF:将非 Java Hive UDAF 的输出转换为地图的主要内容,如果未能解决你的问题,请参考以下文章

hive UDAF

如何使用 Java 为 Hive 编写 UDAF 函数

如何使用接受多列作为参数的java为hive编写UDAF?

Hive中自定义UDAF函数生产小案例

用java编写的hive udf、udaf、udtfs如何在eclipse之类的ide中调试?

Hive UDAF开发详解