首页 > 解决方案 > spark cogroup/join KeyValueGroupedDataset 与数据集

问题描述

我有 2 个数据集。首先有许多具有唯一键的行

ds1
key   val1   val2
1     a      1
2     a      2
3     b      3
4     c      3

在第二个相同的键可以遇到很多次。

ds2
key     val1     val2
1       x        x    
1       x        g    
2       u        h    
5       i        j    
               

我需要加入它们,但是内部的逻辑对于简单的加入来说太复杂了,所以我决定使用 cogroup 并迭代数据。

val ds1 = df1.as[ds1].groupByKey(_.key)
val ds2 = df2.as[ds2].groupByKey(_.key)

ds2.cogroup(ds1)(
(k:String, ds2:Iterator[ds2], ds1:Iterator[ds1]) => {
  //some logic
}
)

问题是我实际上并不需要对 ds1 进行分组,因为我知道它拥有唯一的键,但 cogroup 不会过度接受 ds。我知道 RDD 类中有 fullOuterJoin,但据我所知,它的性能更差。

val rdd1 = df1.as[ds1].rdd.map(x => (x.key, x))
val rdd2 = df2.as[ds2].rdd.groupBy(_.key)

rdd2.fullOuterJoin(rdd1)

真的会影响性能吗?如果是这样,有什么替代方案?

我正在使用火花 2.2。

标签: scalaapache-sparkdataset

解决方案


在 Spark 中,性能主要取决于您正在处理的数据量,因为永远记住 spark 是一个计算引擎。您向执行者提供的数据越好,性能就会越好。

Join 用于简单查询,而 co-group 用于对两个数据帧进行分组。有不同的方法可以提高性能,但在您的情况下,您可以创建两个不同的数据框,然后进行简单的连接[如果您的数据框足够大]。虽然 co-group 在同一个 executor 中执行分组,因此它的性能总是更好。


推荐阅读