【发布时间】:2018-04-26 05:45:08
【问题描述】:
我有 RDD,其中每条记录都是 int:
[0,1,2,3,4,5,6,7,8]
我需要做的就是将这个 RDD 分成多个批次。 IE。制作另一个 RDD,其中每个元素都是固定大小的元素列表:
[[0,1,2], [3,4,5], [6,7,8]]
这听起来微不足道,但是,这几天我很困惑,除了以下解决方案之外找不到任何东西:
-
使用 ZipWithIndex 枚举 RDD 中的记录:
[0,1,2,3,4,5] -> [(0, 0),(1, 1),(2, 2),(3, 3),(4, 4),(5, 5)] -
使用 map() 遍历这个 RDD 并计算像
index = int(index / batchSize)这样的索引[1,2,3,4,5,6] -> [(0, 0),(0, 1),(0, 2),(1, 3),(1, 4),(1, 5)] -
然后按生成的索引分组。
[(0, [0,1,2]), (1, [3,4,5])]
这将得到我需要的东西,但是,我不想在这里使用 group by。当您使用普通的 Map Reduce 或 Apache Crunch 之类的抽象时,这很简单。但是有没有办法在 Spark 中产生类似的结果而不使用大量的 group by?
【问题讨论】:
-
您可以 a) 应用多个过滤器; b) 使用自定义分区器并从每个分区创建 RDD。虽然我无法想象你为什么需要固定大小的 RDD。
-
@khachik 您能否详细说明“应用多个过滤器”和“实现自定义分区器”?我不需要固定大小的 RDD。我需要 RDD 中的每条记录都是记录数组(批处理)。这是必需的,因为我的数学模型消耗的不是单条记录,而是一批记录并返回一批预测。
标签: apache-spark rdd batching