Hive UDAF:将非 Java Hive UDAF 的输出投射到地图

Hive UDAF: Casting output of a non-Java Hive UDAF to a map

我正在试验用 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 实际上是否有内置方法来执行此操作?

hive tables 中映射的默认分隔符是映射键和映射值之间的 '[=11=]3' (unicode 0x03),以及集合元素之间的 [=12=]2 (unicode 0x02)(其中映射是键值对的集合)。

所以,在你的情况下,我会尝试使用

覆盖 table 分隔符
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '[=10=]1'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'

您在其他字段中使用冒号逗号可能会有风险。

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

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

将其转换为地图

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