scala - 为什么在 Scio 中您更喜欢聚合而不是 groupByKey?
问题描述
从:
https://github.com/spotify/scio/wiki/Scio-data-guideline
“比 groupByKey 更喜欢 combine/aggregate/reduce 转换。请记住,reduce 操作必须是关联的和可交换的。”
为什么特别喜欢聚合而不是 groupByKey?
解决方案
组合、聚合和归约转换优于 groupByKey,因为前者在管道执行期间内存效率更高。这是由于在 Apache Beam 中实现了原语GroupByKey
和转换。Combine
这个问题的答案不一定是 Scio 特有的。
GroupByKey
要求所有键值对都保留在内存中,这可能会导致OutOfMemoryError
s. 每个窗口的所有键值对都保留在内存中。groupByKey
使用 Beam 的原始GroupByKey
变换。
聚合消除了将所有值保存在内存中的需要,因为值在执行转换期间不断组合/减少。值以不确定的顺序组合/减少,这就是为什么所有组合/减少操作必须是关联的。Scio 的实现aggregateByKey
使用 Beam 的原始Combine
变换。
参考:
1. Scio groupByKey
2. Scio aggregateByKey
3. Apache Beam GroupByKey
4. Apache Beam Combine
5. Google Cloud Dataflow Combine
推荐阅读
- javascript - Programmatic zoom in d3 js timeline chart
- json - Github api不解析多行shell变量
- selenium - 为什么 xpath 不如 Selenium 中的 id 或 name 定位器首选?
- ubuntu - 达到打开文件限制时如何重新启动服务器(系统中打开的文件过多)
- office365api - Microsoft 365 管理 API,currentStatus 返回昨天的“statusTime”字段
- reactjs - MaterialUI - 更改焦点上的颜色文本字段
- jquery - jQuery sortable 不适用于动态添加的 div
- spring - 如何在 Spring Tools 4 IDE 中启用 Spring 支持?
- javascript - 将文件流式传输到 html 视频播放器,因为它正在使用 fs 在 Electron 中下载
- replace - 在 Dart 中查找和替换字符串