【问题标题】:spark cogroup/join KeyValueGroupedDataset with Datasetspark cogroup/join KeyValueGroupedDataset 与数据集
【发布时间】:2021-11-05 03:59:51
【问题描述】:

我有 2 个数据集。 First 有许多行具有唯一键

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)

它真的会影响性能吗?如果可以,有什么替代方案?

我使用的是 spark 2.2。

【问题讨论】:

    标签: scala apache-spark dataset


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 2017-10-13
      • 1970-01-01
      • 2017-10-10
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      相关资源
      最近更新 更多