游戏网站建设的策划书,烟台招远网站建设,国外网站推荐,杭州网站制作多少钱Hive与Presto列转行的区别 1、背景描述2、Hive/Spark列转行3、Presto列转行 1、背景描述 在处理数据时#xff0c;我们经常会遇到一个字段存储多个值#xff0c;这时需要把一行数据转换为多行数据#xff0c;形成标准的结构化数据
例如#xff0c;将下面的两列数据并列转换… Hive与Presto列转行的区别 1、背景描述2、Hive/Spark列转行3、Presto列转行 1、背景描述 在处理数据时我们经常会遇到一个字段存储多个值这时需要把一行数据转换为多行数据形成标准的结构化数据
例如将下面的两列数据并列转换为三行使得code和name一一对应
idcodename1a、b、cA、B、C
Hive、Spark和Presto都提供了这种实现但有所不同。下面通过这个案例介绍三者之间的区别及注意事项
2、Hive/Spark列转行 Hive和Spark都可以使用lateral view posexplode实现
select id, pos1, sub_code, pos2, sub_name from tmp
lateral view posexplode(split(code,、)) v1 as pos1, sub_code
lateral view posexplode(split(name,、)) v2 as pos2, sub_name
where id1 and pos1pos2Hive On MapReduce与Hive On Spark的执行结果如下
idsub_codesub_name1aA1bB1cC
值得注意的是lateral view posexplode会自动过滤被转换列字段值为空的数据进而导致数据丢失
优化方案是将lateral view修改为lateral view outer后尝试
更多关于lateral view UDTF的使用见文章传送门
3、Presto列转行 使用PrestoSQL的交叉连接cross join unnest实现
with t1 as(select id,sub_code,row_number() over() rnfrom tempcross join unnest(split(code, 、)) as t (sub_code)where id1
),
t2 as (select id,sub_name,row_number() over() rnfrom tempcross join unnest(split(name, 、)) as t (sub_name)where id1
)
select t1.id, t1.sub_code, t2.sub_name
from t1
left join t2
on t1.rn t2.rn
order by t1.rnPrestoSQL的执行结果如下
idsub_codesub_name1bB1aA1cC
需要注意的是cross join unnest不会自动过滤被转换列和转换列字段值为空的数据因此此方式数据不会丢失
例如当转换列字段值存在空值时
idcodename1a、b、cA、B
cross join unnest列转行的结果为
idsub_codesub_name1aA1cNULL1bB
当被转换列字段值存在空值时
idcodename1a、b、cNULL
cross join unnest列转行的结果为
idsub_codesub_name1bNULL1aNULL1cNULL