现有两张表: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)
时间: 2024-10-28 02:16:22