【问题标题】:Spark performance issue at NOT IN queryNOT IN 查询中的 Spark 性能问题
【发布时间】:2018-06-21 14:07:19
【问题描述】:

当我在 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 )

仅更改“不在”查询不会解决问题吗?

【问题讨论】:

  • 好像会的。
  • 哪个查询可以完全替换那个查询?

标签: sql apache-spark dataset


【解决方案1】:

AFAIK NOT IN 在 sql 中的开销很大。

由于您使用的是数据帧 (Dataset&lt;Row&gt;),您可以离开 sql 并尝试使用数据帧连接(因为它有其自身的好处(小数据帧将被广播,因此它会很快)

我认为在这种情况下你必须应用左反连接...... 这意味着……

从左侧返回所有不匹配的记录 从右边。结果表只有左边的列 一边。

在此处查看joinTypes..

【讨论】:

  • 我尝试了左反连接,但我遇到了“java.lang.OutOfMemoryError:GC 开销限制超出”。我该如何解决?
  • 可能是它去交叉连接,所以,你能在这里粘贴你的实现细节吗?而且您还有 2 个 leftanti 连接,因此您可以逐步应用它们
  • 我应用了类似'"select * from A left anti join B on A.key1 = B.key2 and A.key2 = B.key2'的查询。然后这个查询将执行 10 次迭代。但是 GC 开销错误发生在第 3 次迭代。
  • “一步一步”是什么意思?
  • 我可以避免交叉连接吗?我想知道我是否可以同样改变结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2011-08-22
  • 2018-10-18
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多