ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Hive中将数据一行转多行、多行转一行、再转为以逗号分隔的string类型

2020-06-16 15:39:20  阅读:576  来源: 互联网

标签:多行 string list 一行 1002 content tag id 1000


Hive中将数据一行转多行、多行转一行、再转为以逗号分隔的string类型

背景

表content中有观看内容id(content_id),内容标签id列表(tag_id_list),如下所示:

content_id tag_id_list
1 1000,1001,1002
2 1000,1003
3 1002,1003
4 1002,1004

表id_decode中有内容标签id(tagid),内容标签中文(tagname),如下所示:

tagid tagname
1000 游戏
1001 吃鸡
1002 精彩操作
1003 王者荣耀
1004 大神

目标:将原来content表中的内容标签id列表字段转换成内容标签中文列表

Step 1:将content表的tag_id_list一行转多行

使用lateral view和split结合起来,将一行数据拆分为多行数据

select content_id, tag_id_list, tag_id
from content
lateral view explode(split(tag_id_list, ',')) myTable as tag_id

得到的表结果为:

content_id tag_id_list tag_id
1 1000,1001,1002 1000
1 1000,1001,1002 1001
1 1000,1001,1002 1002
2 1000,1003 1000
2 1000,1003 1003
3 1002,1003 1002
3 1002,1003 1003
4 1002,1004 1002
4 1002,1004 1004

Step 2:将step 1中的表中tag_id匹配中文后,进行多行转一行

先将step 1中得到的表格与表id_decode进行left join,实现中文的匹配,之后再利用collset_set()这个函数将多行的中文转为一行

select content_id, collect_set(tagname) as tags
from(
    select content_id, tag_id_list, tag_id, tagname
    from (
        select content_id, tag_id_list, tag_id
        from content
        lateral view explode(split(tag_id_list, ',')) myTable as tag_id
    ) content_list_id
    left join (
        select tagid, tagname
        from id_decode
    ) tran_id
    on content_list_id.tag_id = tran_id.tagid
)
group by content_id

得到的表结果为:

content_id tags
1 [游戏,吃鸡,精彩操作]
2 [游戏,王者荣耀]
3 [精彩操作,王者荣耀]
4 [精彩操作,大神]

至此,其实已经完成了内容标签id列表字段转换成内容标签中文列表的任务。

但是,在我之前的实际操作中,最后需要将A平台利用Hive得到的表写入使用mysql的B平台。而当以上述select语句得到的表进行直接的insert时候,会报错。(具体的报错内容不记得了,只记得报错语句里面有udf和string,依稀记得是关于udf和string的转化错误的报错)

当时细心的我(手动狗头

标签:多行,string,list,一行,1002,content,tag,id,1000
来源: https://blog.csdn.net/some_apples/article/details/106762130

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有