【发布时间】:2020-05-03 04:17:47
【问题描述】:
是否有任何自定义 udf 或其他函数可用于序列化 hive map 字段,以便可以在 group by 和 join 条件中使用。
例如,我们有一个地图字段:
dim_map = {'dim_geo': 'San Francisco', 'dim_country': 'USA'}
因为想在这个字段上加入两个表。
【问题讨论】:
标签: dictionary hive hiveql
是否有任何自定义 udf 或其他函数可用于序列化 hive map 字段,以便可以在 group by 和 join 条件中使用。
例如,我们有一个地图字段:
dim_map = {'dim_geo': 'San Francisco', 'dim_country': 'USA'}
因为想在这个字段上加入两个表。
【问题讨论】:
标签: dictionary hive hiveql
使用brickhouse udf将其转换为JSON字符串,下载源代码,编译,添加jar文件并创建函数,见Getting Started说明:
add jar /path/brickhouse-0.7.0-SNAPSHOT.jar;
CREATE TEMPORARY FUNCTION to_json AS 'brickhouse.udf.json.ToJsonUDF';
select to_json(dim_map) as dim_map_json
from...
更新:
正如评论中提到的@rajnish,地图没有排序,这可能会导致比较转换为 JSON 的地图时出现问题。
地图示例:
with test_data as (
select map('dim_geo', 'San Francisco', 'dim_country','USA') map1,
map('dim_country','USA','dim_geo', 'San Francisco') map2
)
select map1, map2,
case when map1['dim_geo'] = map2['dim_geo']
and map1['dim_country'] = map2['dim_country']
then 'equal'
else 'not equal' end as compare_maps
from test_data;
结果:
map1 map2 compare_maps
{"dim_geo":"San Francisco","dim_country":"USA"} {"dim_country":"USA","dim_geo":"San Francisco"} equal
最好像本例那样比较每个值,或者使用 HashMap.equals 方法编写自己的 UDF。
默认情况下,HashMap。 equals() 方法通过键值对比较两个哈希图。这意味着两个 hashmap 实例必须具有完全相同的键值对,并且两者的大小必须相同。键值对的顺序可以不同,并且在比较中不起作用。 How to compare two hashmaps in Java
【讨论】:
f(dim_map) --> val: string,它会根据一些排序的键或值生成 json。如果我要加入两个不同的表,那么它是一致的。