如何像蜂巢中的地图一样将两列合并为一列?
Posted
技术标签:
【中文标题】如何像蜂巢中的地图一样将两列合并为一列?【英文标题】:how to combine two columns to one column like a map in hive? 【发布时间】:2020-07-10 03:29:28 【问题描述】:在 hive 中,我在一个表中有两列:
user_id product_id score
1 1, 2, 3 0.7, 0.2, 0.1
2 2, 3, 1 0.5, 0.25, 0.25
product_id 和 score 的类型都是字符串。现在我希望生成一个由 product_id 和 score 组合的新列,如下所示:
user_id product_score
1 1:0.7, 2:0.2, 3:0.1
2 2:0.5, 3:0.25, 1:0.25
在新表中,product_score这个列就像一个map,product_id是key,score是value,但其实还是一个字符串。 product_id 和 score 由 ':' 连接。不同的product_id 由',' 连接,并按初始表中product_id 中的初始顺序排序。我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:使用split()获取数组,map()转换为map
select user_id,
map(product_id[0], score[0],
product_id[1], score[1],
product_id[2], score[2]
) as product_score
(
select user_id, split(product_id,',') as product_id, split(score,',') as score
from ...
)s;
【讨论】:
我会在这里使用map(product_id[0], score[0] ...)
而不是构造/解构字符串【参考方案2】:
已解决 - 按顺序合并两个数组列,例如键和值映射。
方法 - 使用poseexplode方法分解数组并从多个列中获取相等的pos值
SQL 查询 -
with rowidcol as
(
select user_id, split(product_id, ',') prod_arr, split(score, ',') score_arr, row_number() over() as row_id
from prod
),
coltorows as
(
select row_id, user_id, prod_arr[prd_index] product, score_arr[score_index] score, prd_index, score_index
from rowidcol
LATERAL view posexplode(prod_arr) ptable as prd_index, pdid
LATERAL view posexplode(score_arr) prtable as score_index, sid
),
colselect as
(
select row_id, user_id, collect_list(concat(product, ':', score)) product_score
from coltorows
where prd_index = score_index
group by row_id, user_id
)
select user_id, concat_ws(',', product_score) as prodcut_score
from colselect
order by user_id;
输入 - 表名 - 产品 -
user_id product_id score
1 A,B,C,D 10,20,30,40
2 X,Y,Z 1,2,3
3 K,F,G 100,200,300
输出 -
user_id prodcut_score
1 A:10,B:20,C:30,D:40
2 X:1,Y:2,Z:3
3 K:100,F:200,G:300
【讨论】:
以上是关于如何像蜂巢中的地图一样将两列合并为一列?的主要内容,如果未能解决你的问题,请参考以下文章