【问题标题】:Select N elements from each partition in spark从 spark 的每个分区中选择 N 个元素
【发布时间】:2020-02-11 02:15:37
【问题描述】:

假设我有一个 RDD。我将 RDD 的分区数设置为 5。我想从每个分区中选择 10 元素并将它们存储在一个名为 var1 的变量中,稍后我想广播 var1。我怎样才能做到这一点?

如果我使用它会导致大量数据洗牌,所以我可以使用收集。我必须将每个分区中的选定元素存储在一个变量中。还要考虑这是一个迭代问题,我必须在 X 指定迭代之后广播。

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    您可以尝试使用.mapPartitionsWithIndex 获取分区号,使用.groupBy 按分区分组,使用.zipWithIndex 添加id,然后使用.filter 为每个组过滤最多10 条记录,最后使用.collect

    【讨论】:

    • 不能使用 collect() 因为这会导致更高的通信开销
    【解决方案2】:

    将 take(n) 函数应用于 RDD 的每个分区,这将 生成另一个包含 n*noOfPartitions 项的 RDD。

    val var1 = rdd.mapPartitions(rows  => rows.take(10)).collect()
    

    注意:这里收集发生在结果 RDD 中,应该很多 比原始 RDD 小(前提是 n 足够小)。

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多