【发布时间】:2020-02-11 02:15:37
【问题描述】:
假设我有一个 RDD。我将 RDD 的分区数设置为 5。我想从每个分区中选择 10 元素并将它们存储在一个名为 var1 的变量中,稍后我想广播 var1。我怎样才能做到这一点?
如果我使用它会导致大量数据洗牌,所以我可以使用收集。我必须将每个分区中的选定元素存储在一个变量中。还要考虑这是一个迭代问题,我必须在 X 指定迭代之后广播。
【问题讨论】:
标签: scala apache-spark rdd
假设我有一个 RDD。我将 RDD 的分区数设置为 5。我想从每个分区中选择 10 元素并将它们存储在一个名为 var1 的变量中,稍后我想广播 var1。我怎样才能做到这一点?
如果我使用它会导致大量数据洗牌,所以我可以使用收集。我必须将每个分区中的选定元素存储在一个变量中。还要考虑这是一个迭代问题,我必须在 X 指定迭代之后广播。
【问题讨论】:
标签: scala apache-spark rdd
您可以尝试使用.mapPartitionsWithIndex 获取分区号,使用.groupBy 按分区分组,使用.zipWithIndex 添加id,然后使用.filter 为每个组过滤最多10 条记录,最后使用.collect。
【讨论】:
将 take(n) 函数应用于 RDD 的每个分区,这将 生成另一个包含 n*noOfPartitions 项的 RDD。
val var1 = rdd.mapPartitions(rows => rows.take(10)).collect()
注意:这里收集发生在结果 RDD 中,应该很多 比原始 RDD 小(前提是 n 足够小)。
【讨论】: