小谈:你知道的越多不知道的就越多
最近将SQL进阶这本书看完了,感觉收益颇丰。对我以前的SQL有了很大的改观,虽然短时间内看不出来,但是时间久了就会越发明显。什么关联子查询,not exists之类的。还有SQL编程。现在就一心一意的更新HIVE里面的知识,后续会更新数仓的知识。
Explode初了解:在hive中,使用行转列我们通常会用到explode。explode我们俗称它为炸裂。
explode() 接收一个 array 或 map 类型的数据作为输入,然后将 array 或 map 里面的元素按照每行的形式输出。下面来看几个例子来熟悉一下explode吧
select explode(array('A','B','C'));
上面个SQL就是将数组array进行炸裂,将一行炸裂成多列
即
A,B,C ====> A B C将map炸裂分开
即
通常情况下,explode是和lateral view一块使用配合的。
下面通过一个例子讲解lateral view
先看元数据
将userrole字段里面的属性进行炸裂
select explode(userrole) from t_4
系统报错,报错内容说,explode要炸裂的必须是数组或者map。我们上面的userrole并不是数组或者map。因此我们要将它转换为数组。
select split(userrole,',') 根据,进行切分 split之后,就会成为数组。
spllt之前 演员,导演,制片人
split之后 [演员,导演,制片人]
因此,我们要想成功炸裂,整合一下
select explode(split(userrole,','))
我们既然已经将userrle这个字段炸开了,那么我们接上username字段
从上面的图片中,可以看到,出错。
报错信息:UDTF不支持我们将explode和其它字段放一块进行查找。
因此,我们的重头戏就来了
lateral view救场select username,role from t_4 LATERAL VIEW explode(split(userrole,',')) tmpTable as role
可以看到,我们的结果做对了。但是同时注意一点,later view 之后的explode需要我们给他一个别名。如果不给别名 ,我们上面的查询字段里面就会报错
总结:
- 一个SQL 里lateral view 你可以多次使用,就会多次做笛卡尔积;UDTF 要配合lateral view 一起使用才可以;典型的行转列
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)