Hive中如何将表内两列分别作为键值合并为单个map类型列
Hive实现将两列值转为对应Map键值列
直接使用Hive内置的map()构造函数即可满足需求,该函数接收成对的入参,按位置将奇数位参数作为Map的key,紧邻的下一位偶数位参数作为对应value。
假设你的原表名为source_table,直接执行如下查询即可得到预期结果:
SELECT map(a, b) AS c FROM source_table;
执行后返回的c列为MAP类型,每行数据都会以当前行的a列值为键、b列值为值生成单键值对的Map结构,返回结果和预期完全一致:
c ----------- {1:2} {3:4}
扩展场景说明
如果你需要将全表所有行的a、b键值对聚合为一个总的Map(最终仅返回1行结果),可以使用如下写法:
- Hive 2.3及以上版本支持
map_from_entries函数,写法更简洁:
SELECT map_from_entries(collect_list(named_struct('key', a, 'value', b))) AS c FROM source_table;
- 低版本Hive可以通过字符串拼接转换实现:
SELECT str_to_map(concat_ws(',', collect_list(concat(a, ':', b)))) AS c FROM source_table;
注意:聚合为单Map的场景下,如果表中存在重复的a列值,后收集到的键值对会覆盖同key的原有value。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

