美文网首页大数据知识杂谈
hive join操作sql整理

hive join操作sql整理

作者: 稻草人_d41b | 来源:发表于2018-10-18 19:41 被阅读0次

在使用hive进行数据加工处理时,经常要进行两个数据表join关联,接下来具体介绍hive sql中要使用的join。

本实验用到a表和b表,表结构如下:

hive> desc a;

    OK

    id string

    name string

    Time taken: 0.094 seconds, Fetched: 2 row(s)

    hive> select * from a;

    OK

    1 zhangsan

    2 lisi

    3 wangwu

    Time taken: 0.116 seconds, Fetched: 3 row(s)

    hive> desc b;

    OK

    id string

    age int

    Time taken: 0.159 seconds, Fetched: 2 row(s)

    hive> select * from b;

    OK

    1 30

    2 29

    4 21

    Time taken: 0.09 seconds, Fetched: 3 row(s)

join(内关联,默认是inner join)

选出两个表中都有的值进行关联。

在使用join时,数据状况是有一个大表和小表,则可以使用mapjoin,需要将小表放到 sql的join之前,执行sql时会将小表广播预加载到内存中,这样在进行join时,省略掉常规关联所需的reduce过程。即使对于很小的数据集,这个优化也明显地要快于常规的连接操作。其不仅减少了reduce过程,而且有时还可以同时减少Map过程的执行步骤。在hive 0.11.0版本之前需要开启这项优化set hive.auto.convert.join = true。而小文件大小定义是通过hive.mapjoin.smalltable.filesize设置,默认是256m

SELECT a.id,

    a.name,

    b.age

    FROM  a

    join  b

    ON (a.id = b.id);

    --执行结果

    1 zhangsan 30

    2 lisi 29

LEFT [OUTER] JOIN(左外关联)

以左表为基础,如果右侧表可以和左侧表关联,则值为右侧表值,否则为NULL

SELECT a.id,

    a.name,

    b.age

    FROM a

    left join  b

    ON (a.id = b.id);

    --执行结果:

    1 zhangsan 30

    2 lisi 29

    3 wangwu NULL

RIGHT [OUTER] JOIN(右外关联)

以右表为基础,如果左侧表可以和右侧表关联,则值为左侧表值,否则为NULL

SELECT a.id,

    a.name,

    b.age

    FROM a

    RIGHT OUTER JOIN  b

    ON (a.id = b.id);

    --执行结果:

    1 zhangsan 30

    2 lisi 29

    NULL NULL 21

FULL [OUTER] JOIN(全关联)

两个表进行关联,如果右表没有值补充NULL、如果左边没有值补充NULL

SELECT a.id,

a.name,

b.age

FROM a

FULL OUTER JOIN  b

ON (a.id = b.id);

--执行结果:

1 zhangsan 30

2 lisi 29

3 wangwu NULL

NULL NULL 21

LEFT SEMI JOIN

左边表返回key在右边表中存在的值对应的数据

SELECT a.id,

    a.name

    FROM  a

    LEFT SEMI JOIN b

    ON (a.id = b.id);

    --执行结果:

    1 zhangsan

    2 lisi

    --等价于:

    SELECT a.id,

    a.name

    FROM a

    WHERE a.id IN (SELECT id FROM b);

CROSS JOIN(笛卡尔积关联)

返回两个表的笛卡尔积结果,不需要指定关联键

SELECT a.id,

    a.name,

    b.age

    FROM  a

    CROSS JOIN  b;

    --执行结果:

    1 zhangsan 30

    1 zhangsan 29

    1 zhangsan 21

    2 lisi 30

    2 lisi 29

    2 lisi 21

    3 wangwu 30

    3 wangwu 29

    3 wangwu 21

相关文章

网友评论

    本文标题:hive join操作sql整理

    本文链接:https://www.haomeiwen.com/subject/lgbszftx.html