NOT IN查询中的Spark性能问题

时间:2018-01-12 06:27:14

标签: sql apache-spark dataset

当我在SPARK(2.0)中执行该查询时,没有随机读/写并且在40分钟内挂起以执行该查询。

SELECT * FROM A WHERE A.key1 NOT IN ( SELECT B.key1 from B ) AND A.key2 NOT IN (SELECT B.key2 from B )

这只是一个写作的动作。

Dataset<Row> re = Operation.project(ss, var, A, B);
re.write()
    .format("jdbc")
    .option("driver", "var.Driver")
    .option("url", var.url)
    .option("dbtable", var.tablename)
    .option("user", var.username)
    .option("password", var.password)
    .save();

A和B中的记录数小于100,000。 所以,我认为这个查询有问题。 但是这个查询只花了30秒。(它也是写动作)

SELECT * FROM A WHERE (A.key1, A.key2) IN ( SELECT B.key1, B.key2 FROM B )

通过仅更改&#39;而不是&#39;不会解决问题。查询?

1 个答案:

答案 0 :(得分:1)

AFAIK NOT IN在sql中很昂贵。

由于您使用的是数据帧(Dataset<Row>),您可以保留sql并尝试使用数据帧连接(因为它有自己的好处(小数据帧将被广播,因此它会很快)

我认为你必须在这种情况下申请左反联接...... 这意味着......

  

返回左侧没有匹配项的所有记录   从右边开始。结果表只有左侧的列   侧。

enter image description here

请参阅joinTypes此处..