![79b837149be8cf4e8b3b10ed64e23206.png](https://img-blog.csdnimg.cn/img_convert/79b837149be8cf4e8b3b10ed64e23206.png)
在做特征工程的时候,会经常会碰到一个场景,比如手上有一张用户表user,记录了用户某款产品每一天各个功能的使用次数,存储方式类似key-value键值结构。具体如下:
![439cb88439ac59cefdb3fe7a29e4e514.png](https://img-blog.csdnimg.cn/img_convert/439cb88439ac59cefdb3fe7a29e4e514.png)
此时需要对用户进行建模,需要一张用户纬度的特征表,记录用户在每个功能的使用次数、占比的特征,这种情况就需要行转列的操作。而相应的有反操作,列转行。
行转列
- case when <expr> then <result>…else <default> end
- if(expr, true_result, false_result)
##
![d529f2b2fb0d53699b4cb7f7a332a2b4.png](https://img-blog.csdnimg.cn/img_convert/d529f2b2fb0d53699b4cb7f7a332a2b4.png)
除了以上根据条件判断来实现行转列的场景,有的场景是要把多行合并,比如有用户的评论流水表comment,此时我们想对同一个用户的所有评论拼接到一起,然后做文本分类。
![9559359ab16a13b50ca0a78c99f1c380.png](https://img-blog.csdnimg.cn/img_convert/9559359ab16a13b50ca0a78c99f1c380.png)
- collect_list:把列聚合成为数组,不去重
- collect_set:把列聚合成为数据,去重
- concat_ws(separator, str1, str2, ...):把多个字符串用分隔符进行拼接
select
![0a65375d2360210134d816ad7c710d60.png](https://img-blog.csdnimg.cn/img_convert/0a65375d2360210134d816ad7c710d60.png)
(思考题:如果要按照时间sendtime来排序,那应该怎么实现呢?至少有两种解决思路)
![9496f386534d5b6e04cbc789d90d5817.png](https://img-blog.csdnimg.cn/img_convert/9496f386534d5b6e04cbc789d90d5817.png)
列转行
有的时候我们拿到像用户玩过的各种游戏的数据表,但是游戏是拼接到一起的,这个时候我们只想关注某一些游戏,需要过滤掉不关注的游戏,需要怎么办呢?这时候只需要对表进行列转行操作,然后再进行筛选即可。
![3579954c9658f44fa6c3732c5022f2b9.png](https://img-blog.csdnimg.cn/img_convert/3579954c9658f44fa6c3732c5022f2b9.png)
- explode:处理数组结构的字段,转换成多行;
- LATERAL VIEW:其实explode是一个UDTF函数(一行输入多行输出),这个时候如果要select除了explode得到的字段以外的多个字段,需要创建虚拟表。
select
![f85b58b8112a34bb9057d3c4426c03c6.png](https://img-blog.csdnimg.cn/img_convert/f85b58b8112a34bb9057d3c4426c03c6.png)
这个时候我们只要用select语句筛选关注的游戏即可。
(思考题:如果数据表中,用户和游戏是n对n的关系,应该怎么处理成1对1的关系呢?)
![8644008dd273225338cf8732ba0414ca.png](https://img-blog.csdnimg.cn/img_convert/8644008dd273225338cf8732ba0414ca.png)
(感兴趣的同学在评论区交流哦~)