- Semi JOIN : 查询 Left 数据在 Right 中存在的记录,返回 Left 字段
- Anti JOIN : 查询 Left 数据在 Right 中不存在的记录,返回 Left 字段
- Cross Join : 这个在Spark的代码里没看出和Inner Join有什么区别,在Spark中有一个Inner Like,就是包含Inner Join 和Cross Join的。。
- Natual Join : 我们在正常的Join 前面可以加 Natual 关键字,这个时候不能写ON条件,Spark 在 ResolveNaturalAndUsingJoin RULE中会自动获取Join的Left 和 Right 的输出字段,然后使用相同的字段名,构建Join,然后输出 Left 和 Right 字段的并集
- Using Join : 如果Join条件中的字段名相同,可以使用
USING (col1, col2)
替代 ON left.col1 = right.col1 AND left.col2 = right.col2
, 输出字段和 Natual Join 相同
CREATE TABLE `user_sex` (
`name` STRING,
`sex` STRING)
USING parquet;
CREATE TABLE `user_age` (
`name` STRING,
`age` INT)
USING parquet;
INSERT INTO user_sex values ('老王', '男');
INSERT INTO user_sex values ('老王', '女');
INSERT INTO user_sex values ('小丽', '女');
INSERT INTO user_age values ('老王', 30);
INSERT INTO user_age values ('老王', 40);
INSERT INTO user_age values ('小爱', 18);
set spark.sql.autoBroadcastJoinThreshold=-1;
spark-sql> SELECT * FROM user_sex SEMI join user_age ON user_sex.name = user_age.name;
老王 女
老王 男
Time taken: 0.27 seconds, Fetched 2 row(s)
spark-sql> SELECT * FROM user_sex LEFT SEMI join user_age ON user_sex.name = user_age.name;
老王 女
老王 男
Time taken: 0.358 seconds, Fetched 2 row(s)
spark-sql> SELECT * FROM user_sex ANTI join user_age ON user_sex.name = user_age.name;
小丽 女
Time taken: 0.241 seconds, Fetched 1 row(s)
spark-sql> SELECT * FROM user_sex LEFT ANTI join user_age ON user_sex.name = user_age.name;
小丽 女
Time taken: 0.209 seconds, Fetched 1 row(s)
spark-sql> SELECT * FROM user_sex CROSS JOIN user_age;
老王 女 小爱 18
老王 女 老王 40
老王 女 老王 30
老王 男 小爱 18
老王 男 老王 40
老王 男 老王 30
小丽 女 小爱 18
小丽 女 老王 40
小丽 女 老王 30
Time taken: 0.445 seconds, Fetched 9 row(s)
spark-sql> SELECT * FROM user_sex CROSS JOIN user_age ON user_sex.name = user_age.name;
老王 女 老王 30
老王 女 老王 40
老王 男 老王 30
老王 男 老王 40
Time taken: 0.529 seconds, Fetched 4 row(s)
spark-sql> SELECT * FROM user_sex NATURAL join user_age ON user_sex.name = user_age.name;
Error in query:
mismatched input 'ON' expecting {
<EOF>, ';'}(line 1, pos 45)
== SQL ==
SELECT * FROM user_sex NATURAL join user_age ON user_sex.name = user_age.name
spark-sql> SELECT * FROM user_sex NATURAL join user_age;
老王 女 30
老王 女 40
老王 男 30
老王 男 40
Time taken: 0.418 seconds, Fetched 4 row(s)
spark-sql> SELECT * FROM user_sex join user_age USING (name);
老王 女 30
老王 女 40
老王 男 30
老王 男 40
Time taken: 0.269 seconds, Fetched 4 row(s)