【问题标题】:Spark (large dataset) groupBy, sort, and then mapSpark(大数据集)groupBy,排序,然后映射
【发布时间】:2021-09-10 23:44:08
【问题描述】:

使用 Spark rdd 可以通过 groupByKey 进行分组,然后在每个组中排序,然后映射到大型数据集。这样做的天真方式映射到每个组并为每个组创建一个列表并对其进行排序。但是,这种创建列表可能会导致具有许多条目的组出现内存不足的问题。有没有办法让 Spark 进行排序以避免内存不足的问题。

【问题讨论】:

  • 您目前是否遇到内存错误?
  • 对分组值进行排序的任何具体原因?如果需要识别 top-n 或 bottom-n 值,则可以通过 reduceByKey 逻辑来完成。

标签: apache-spark


【解决方案1】:

听起来您遇到了数据倾斜错误。当执行器内存不足时,可能会发生这种情况,因为与该键关联的数据过多。该问题的解决方案是调整/使用执行器的数量和分配给每个执行器的 RAM 量......

但我相信这将是您问题的解决方案:

JavaPairRDD<Key, Iterable<Value>> pair = ...;
JavaRDD<Iterable<Value>> values = pair.map(t2 -> t2._2());
JavaRDD<Value> onlyValues = values.flatMap(it -> it);

来源:Convert iterable to RDD

请跟进这个可能的解决方案。我真的很好奇。

【讨论】:

  • 第 2 行和第 3 行可以同时执行,应该可以。您可以在 YARN/Spark 的作业查看器中查看此内容
猜你喜欢
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多