配置单元将数组 <map<string, string>> 转换为字符串
hive convert array<map<string, string>> to string
我在 hive table 中有一个列,类型是 array<map<string, string>>
,我正在努力如何使用 hql 将此列转换为 string
?
我在这里 Convert Map<string,string> to just string in hive 找到了 post 来将 map<string, string>
转换为 string
。但是,我仍然无法将 array<map<string, string>>
转换为 string
.
在您链接到的原始答案的基础上,您可以首先使用 posexplode
将数组分解为单独的地图以维护位置列。然后你可以使用原始post中的方法,但额外按位置列分组,将每个映射转换为字符串。然后你将你的地图收集到最终的字符串中。这是一个例子:
with test_data as (
select stack(2,
1, array(map('m1key1', 'm1val1', 'm1key2', 'm1val2'), map('m2key1', 'm2val1', 'm2key2', 'm2val2')),
2, array(map('m1key1', 'm1val1', 'm1key2', 'm1val2'), map('m2key1', 'm2val1', 'm2key2', 'm2val2'))
) as (id, arr_col)
),
map_data as (
select id, arr_col as original_arr, m.pos as map_num, m.val as map_col
from test_data d
lateral view posexplode(arr_col) m as pos, val
),
map_strs as (
select id, original_arr, map_num,
concat('{',concat_ws(',',collect_set(concat(m.key,':', m.val))),'}') map_str
from map_data d
lateral view explode(map_col) m as key, val
group by id, original_arr, map_num
)
select id, original_arr, concat('[', concat_ws(',', collect_set(map_str)), ']') as arr_str
from map_strs
group by id, original_arr;
我在 hive table 中有一个列,类型是 array<map<string, string>>
,我正在努力如何使用 hql 将此列转换为 string
?
我在这里 Convert Map<string,string> to just string in hive 找到了 post 来将 map<string, string>
转换为 string
。但是,我仍然无法将 array<map<string, string>>
转换为 string
.
在您链接到的原始答案的基础上,您可以首先使用 posexplode
将数组分解为单独的地图以维护位置列。然后你可以使用原始post中的方法,但额外按位置列分组,将每个映射转换为字符串。然后你将你的地图收集到最终的字符串中。这是一个例子:
with test_data as (
select stack(2,
1, array(map('m1key1', 'm1val1', 'm1key2', 'm1val2'), map('m2key1', 'm2val1', 'm2key2', 'm2val2')),
2, array(map('m1key1', 'm1val1', 'm1key2', 'm1val2'), map('m2key1', 'm2val1', 'm2key2', 'm2val2'))
) as (id, arr_col)
),
map_data as (
select id, arr_col as original_arr, m.pos as map_num, m.val as map_col
from test_data d
lateral view posexplode(arr_col) m as pos, val
),
map_strs as (
select id, original_arr, map_num,
concat('{',concat_ws(',',collect_set(concat(m.key,':', m.val))),'}') map_str
from map_data d
lateral view explode(map_col) m as key, val
group by id, original_arr, map_num
)
select id, original_arr, concat('[', concat_ws(',', collect_set(map_str)), ']') as arr_str
from map_strs
group by id, original_arr;