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

时间:2016-10-25 13:10:36

标签: python hive user-defined-functions hiveql

我正在尝试使用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文档我也尝试了类似&#34;意思是:1.0,var:2.0&#34;,&#34; MAP(平均值:1.0,var:2.0)&#34;,&#34;意味着:1.0,无功:2.0&#34;等但没有任何效果。实际上是否有一种内置的方法可以在Cloudera上使用Hive进行此操作?

1 个答案:

答案 0 :(得分:0)

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, ',', ':')