一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
上文介绍到炸裂函数的衍生版posexplode函数,和explode(col)不同的就是增加一列索引值,并且其他功能都是一摸一样的。另外还介绍了表的连接左连接left join的用法和注意事项,也附上了案例,还是比较清楚详细的。本文介绍几个在sql开发中比较实用的hive语法,包括union all、left outer join等等。
1、union all 作用:将不同表的查询结果联合起来
常见使用方法:... union all ...
具体功能描述:这个和表连接完全不同,表连接是将数据横向累加在一起,比如left join就是将左右表中的字段累加在一起,根据某一个特定的字段做筛查,数据并不会全部都输出,但是字段肯定是两张表的全部。而union all就完全不同,这个是纵向层面的数据累加,他也是连接两张表,但是要求这两张表必须字段名称完全相同,字段的顺序也要完全相同才行,所以为了保证不出错,每个字段最好都重新as新的名称一下。
下面看个例子吧。
select
grade.id as id
,student_info.employee_ucid as employee_ucid
,student_info.student_name as student_name
,student_info.second_name as second_name
,student_info.create_date as create_date
,student_info.grade_id as grade_id
from
(
select
id
from dwd_grade_info_da
)grade
left join
(
select
substr(employee_ucid,9) as employee_ucid
,name as student_name
,second_name as second_name
,date(create_time) as create_date
,grade_id as grade_id
from dw_student_out_da
where pt = '${-1d}'
union all
select
employee_ucid as employee_ucid
,name as student_name
,concat('昵称',second_name) as second_name
,date(create_time) as create_date
,grade_id as grade_id
from dwd_student_info_da
where pt ='${-1d}'
)student_info
on student_info.grade_id=grade.id
上述这个例子就是实现了数据的横向和纵向的累加,分别使用了left join和union all进行数据的处理,大家可以验证结果看下。
可以将union all的上下两张表的字段名称改掉,此时就会报错了。可以分别看下两种结果。
left outer join
这也是一种左连接,特别要注意的就是在hive中的使用,结合到分区字段的时候,右边的表的分区字段要写在on里面。否则会识别不到分区字段。如下的案例:
select
stu.id
,stu.name
,act.action
from student_info stu
left outer join student_activity_info act
on (
stu.id=act.student_id
and act.pt = '${-1H}'
)
where 。。。。。。