【问题标题】:Spark: where doesn't work properlySpark:哪里不能正常工作
【发布时间】:2018-06-28 02:56:46
【问题描述】:

我有 2 个数据集,我想创建一个连接数据集,所以我做了

Dataset<Row> join = ds1.join(ds2, "id");

但是为了提高性能,我尝试将 join 替换为 .where(cond)(我也尝试过 .filter(cond)),如下所示:

Dataset<Row> join = ds1.where(col("id").equalTo(ds2.col("id"));

这也有效,但当其中一个数据集为空时不起作用(在这种情况下,它将返回非空数据集),但这不是预期的结果。

所以我的问题是为什么 .where 在这种情况下不能正常工作,或者是否有另一种优化的解决方案可以在不使用 join() 的情况下加入 2 个数据集。

【问题讨论】:

  • 为什么你认为where 是对join 的性能提升?
  • @pault 听专家说的,我也试过测量filter和join的执行时间,filter似乎更快,可能是因为join使用笛卡尔积进行join。

标签: apache-spark apache-spark-sql apache-spark-dataset


【解决方案1】:

Join 和 where 条件是两个不同的东西。由于 resolve 属性问题,您的 where 条件代码将失败。 where 条件或过滤条件特定于该 DataFrame。如果你在条件中提到第二个 DataFrame,它不会像 join 那样迭代。如果您得到结果,请检查您的代码

【讨论】:

    【解决方案2】:

    当你想加入两个 RDD 时,绝对的关键点之一就是在这两个 RDD 上使用的分区器。如果第一个和第二个 rdd 具有相同的分区器,那么您的连接操作将处于最佳性能。如果分区器不同,那么第一个 rdd 的分区器将用于对第二个 rdd 进行分区。

    然后尝试只使用“灯光键”,例如使用字符串的编码或散列输出,而不是使用原始的,并且为两个 rdds 使用相同的分区器。

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 2021-01-19
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2013-03-30
      • 2010-11-30
      • 2021-10-02
      • 2017-08-06
      相关资源
      最近更新 更多