我有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个数据集。
答案 0 :(得分:1)
要连接两个RDD时,绝对要害之一是在这两个RDD上使用分区。如果第一个和第二个rdd具有相同的分区程序,则您的加入操作将达到最佳性能。如果分区程序有所不同,则第一个rdd的分区程序将用于对第二个rdd进行分区。
然后尝试仅使用“轻键”,例如使用String的编码或哈希输出,而不是对两个rdds使用原始的和相同的分区程序。
答案 1 :(得分:1)
加入和条件是两个不同的事物。由于resolve属性问题,您的条件代码将失败。 where条件或过滤器条件特定于该DataFrame。如果您要提及第二个DataFrame,则不会像join那样迭代。如果您完全得到结果,请检查您的代码