hive语法使用之数据结合

372 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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 。。。。。。