序列化配置单元Map列

bejyjqdl  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(296)

是否有任何自定义udf或其他函数可用于序列化配置单元Map字段,以便在group by和join条件中使用。
例如,我们有一个Map字段:

dim_map = {'dim_geo': 'San Francisco', 'dim_country': 'USA'}

因为我想在这个字段上连接两个表。

yhived7q

yhived7q1#

使用brickhouse udf将其转换为json字符串,下载源代码,编译,添加jar文件并创建函数,参见入门说明:

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在注解中提到的,Map没有排序,这可能会导致比较转换为json的Map时出现问题。
Map示例:

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方法编写自己的自定义项。
默认情况下,hashmap。equals()方法通过键值对比较两个哈希Map。这意味着两个hashmap示例必须具有完全相同的键值对,并且两者的大小必须相同。键值对的顺序可以不同,在比较中不起作用。如何比较java中的两个hashmap

相关问题