scala - 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。
解决方案
在 Spark 中,性能主要取决于您正在处理的数据量,因为永远记住 spark 是一个计算引擎。您向执行者提供的数据越好,性能就会越好。
Join 用于简单查询,而 co-group 用于对两个数据帧进行分组。有不同的方法可以提高性能,但在您的情况下,您可以创建两个不同的数据框,然后进行简单的连接[如果您的数据框足够大]。虽然 co-group 在同一个 executor 中执行分组,因此它的性能总是更好。
推荐阅读
- python - 在 Python pandas 中将数据映射到另一年的同一工作日
- apache-spark - 用于 Python 的 Spark 列函数
- python - 仅比较元组的第一个数字
- android - Android Camera2 以 4:3 纵横比预览和捕捉,但宽度 > 高度
- python - django-oauth-toolkit :自定义身份验证响应
- google-cloud-platform - 无法删除集群,Peering 不存在
- azure - 使用 Microsoft Speech API 对多种声音进行语音到文本识别?
- python - AttributeError: _nanosecond 在更新事务中的日期时间时
- javascript - 在复杂的 v-for 循环中预选 Vue 组件中的无线电输入
- macros - SAS 宏代码生成特定年份的平均销售额