Python 配置单元UDAF:将非Java配置单元UDAF的输出强制转换为映射
我正在试验用Python编写的Hive UDAFs,如:Python 配置单元UDAF:将非Java配置单元UDAF的输出强制转换为映射,python,hive,user-defined-functions,hiveql,Python,Hive,User Defined Functions,Hiveql,我正在试验用Python编写的Hive UDAFs,如: 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; 在上面的示例中,我尝试将其作为JSON字符串返回,HiveQL将其解释为键,并将null设置为值。
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;
在上面的示例中,我尝试将其作为JSON字符串返回,HiveQL将其解释为键,并将null设置为值。在彻底阅读HiveQL文档的同时,我还尝试了“平均值:1.0,变量:2.0”、“映射(平均值:1.0,变量:2.0)”、“平均值:1.0,变量:2.0”等方法,但没有任何效果。Cloudera上的Hive是否真的有内置的方法来实现这一点 配置单元表中映射的默认分隔符是映射键和映射值之间的
'\003'
(unicode 0x03),以及集合元素(其中映射是键值对的集合)之间的\002
(unicode 0x02)
因此,在您的情况下,我将尝试使用
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
可能有风险的是,在其他字段中有冒号
或者,您可以尝试使用默认分隔符输出地图
如果这不起作用,您可以从UDAF获取一个字符串,并使用
stru-to-map(text,,,:)
配置单元表中映射的默认分隔符是映射键和映射值之间的'\003'
(unicode 0x03),以及集合元素之间的\002
(unicode 0x02)(其中映射是键-值对的集合)
因此,在您的情况下,我将尝试使用
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
可能有风险的是,在其他字段中有冒号
或者,您可以尝试使用默认分隔符输出地图
如果这不起作用,您可以从UDAF获取一个字符串,并使用
str_-to-u-map(text,,,:)
因此在Python脚本中输出'mean\x031.0\x02variance\x032.0'
是有效的!非常感谢。还应该提到的是,str_to_map
只对map
有效,因此没有浮点键。因此在Python脚本中输出'mean\x031.0\x02variance\x032.0'
是可行的!非常感谢。还应该提到的是,str_to_map
仅适用于map
,因此没有浮动键。