hive 相同key 多行多列合并 处理

概述

在join 的过程中我们很容易出现数据膨胀现象,即一行变成多行情况。
面对这种情况,一般会有两种处理方式
第一种:用row_number 等分窗函数,根据不同策略取不同行的数据
第二种:将相同key对应多行的情况合并成一行,(如果一行有多个字段,还有可能合并为一个字段中)

实现方式

如源表结构:

pcgid               string                                  
mobilegid           string                                  
value               double  

测试数据如下:

p1 m1 0.6
p1 m2 0.9
p2 m1 1.0

需要的结果是:
对源表进行group by之后对另外两个字段变成key-value存成一个map

p1 {"m2":"0.9","m1":"0.6"} 2

p2 {"m1":"1.0"} 1

查了一下,hive中没有现成的函数可以直接得到结果。不过可以转一个思路,把mobilegid和value先连接成字符串,然后再把整个set的结果连接成一个字符串,最后再用str_to_map,完美解决。

具体实现代码通过:str_to_map、concat 和collect_set 三个函数共同完成
具体实现为:

select pcgid as gid,str_to_map(concat_ws(",",collect_set(concat_ws(':', mobilegid, cast(value as string)) ))) as gids,count(1) as num
from gemini_product_id_connect_result_pair  
group by pcgid;

你可能感兴趣的:(hive,工作实践,大数据,大数据,hive)