我正在尝试使用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进行此操作?
答案 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, ',', ':')