Spark:无法正常工作的地方

时间:2018-06-27 17:43:27

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

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

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

但是,为了提高性能,我尝试用.where(cond)(我也尝试过.filter(cond)代替join:

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

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

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

2 个答案:

答案 0 :(得分:1)

要连接两个RDD时,绝对要害之一是在这两个RDD上使用分区。如果第一个和第二个rdd具有相同的分区程序,则您的加入操作将达到最佳性能。如果分区程序有所不同,则第一个rdd的分区程序将用于对第二个rdd进行分区。

然后尝试仅使用“轻键”,例如使用String的编码或哈希输出,而不是对两个rdds使用原始的和相同的分区程序。

答案 1 :(得分:1)

加入和条件是两个不同的事物。由于resolve属性问题,您的条件代码将失败。 where条件或过滤器条件特定于该DataFrame。如果您要提及第二个DataFrame,则不会像join那样迭代。如果您完全得到结果,请检查您的代码