码迷,mamicode.com
首页 > 其他好文 > 详细

Hive连接查询

时间:2015-08-17 19:23:04      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

现有两张表:sales 列出了人名及其所购商品的 ID;things 列出商品的 ID 和名称:

hive> select * from sales;
OK
Joe     2
Hank    4
Ali     0
Eve     3
Hank    2
Time taken: 0.085 seconds, Fetched: 5 row(s)
hive> select * from things;
OK
2       Tie
4       Coat
3       Hat
1       Scarf
Time taken: 0.069 seconds, Fetched: 4 row(s)

1.内连接

  Hive只支持等值连接,这意味着在 ON 关键字后的表达式中只能使用等号

hive> select sales.*,things.*
    > from sales JOIN things ON(sales.id = things.id);
Joe     2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
Hank    2       2       Tie

  此外还可以在Where子句中指定连接条件。 

hive> select sales.*,things.*                  
    > from sales,things
    > where sales.id = things.id;
OK
Joe     2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
Hank    2       2       Tie

  单个的连接用一个 MR 作业实现。但是,如果多个连接的连接条件中使用了相同的列,那么平均每个连接可以至少用一个 MR 作业来实现。

可以在查询前使用 Explain 关键字来查看 Hive将为某个查询使用多少个 MR 作业:【此部分在以后详述

hive> explain
    > select sales.*,things.*
    > from sales join things on (sales.id=things.id);

2.外连接

    外连接可以让你找到连接表中不能匹配的数据行

    前面的内连接,【Ali】那一行没有出现在输出中。因为她所购买商品的ID没有在things表中出现。

  左外连接:就可以显示左边表的所有数据行:T_Name1 LEFT OUTER JOIN T_Name2 ON()

hive> select sales.*,things.*                             
    > from sales LEFT OUTER JOIN things ON(sales.id = things.id);
OK
Joe     2       2       Tie
Hank    4       4       Coat
Ali     0       NULL    NULL
Eve     3       3       Hat
Hank    2       2       Tie
Time taken: 13.387 seconds, Fetched: 5 row(s)

  右外连接T_Name1 RIGHT OUTER JOIN T_Name2 ON()

hive> select sales.*,things.*                                    
    > from sales RIGHT OUTER JOIN things ON(sales.id = things.id);
OK
Joe     2       2       Tie
Hank    2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
NULL    NULL    1       Scarf
Time taken: 14.54 seconds, Fetched: 5 row(s)

  全外连接T_Name1 FULL OUTER JOIN T_Name2 ON()

hive> select sales.*,things.*                                     
    > from sales FULL OUTER JOIN things ON(sales.id = things.id); 
OK
Ali     0       NULL    NULL
NULL    NULL    1       Scarf
Hank    2       2       Tie
Joe     2       2       Tie
Eve     3       3       Hat
Hank    4       4       Coat
Time taken: 44.671 seconds, Fetched: 6 row(s)

  半连接T_Name1 LEFT SEMI JOIN T_Name2 ON()  

hive> select * from things
    > where things.id in   
    > (select id from sales);
OK
2       Tie
4       Coat
3       Hat
Time taken: 15.633 seconds, Fetched: 3 row(s)

  这种IN查询可以转化为 半连接查询 : 

  左半连接查询必须遵循一个限制:右表(sales)只能在ON子句中出现。例如,不能在Select表达式中引用右表。

hive> select * from things 
    > LEFT SEMI JOIN sales ON(sales.id=things.id);
OK
2       Tie
4       Coat
3       Hat
Time taken: 13.169 seconds, Fetched: 3 row(s)

 

Hive连接查询

标签:

原文地址:http://www.cnblogs.com/skyl/p/4737347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!