Spark中几种不常见的Join

  • 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;

-- Semi Join 类似 left IN right 查询, LEFT 关键字写和不写一样
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)

-- Anti Join 类似于 Left NOT IN right 查询, LEFT 关键字写和不写一样
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)

-- Cross Join 测试
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)

-- Natual Join 不能写On条件
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)

-- Using Join 直接写查询条件
spark-sql> SELECT * FROM user_sex join user_age USING (name);
老王	女	30
老王	女	40
老王	男	30
老王	男	40
Time taken: 0.269 seconds, Fetched 4 row(s)

Guess you like

Origin blog.csdn.net/wankunde/article/details/117063660