【问题标题】:Dealing with Iterable in apache-spark在 apache-spark 中处理 Iterable
【发布时间】:2017-03-25 19:41:47
【问题描述】:

假设我有一个 RDD[Int]。在我通过一些鉴别器函数执行 groupBy 之后,我留下了一个 RDD [(Int,Iterable [Int])]。

由于这个 Iterable 可能很大,它应该分布在节点之间。但是没有办法像处理 RDD 那样处理它。

例如,如果我想进一步与其中一个 Iterables 进行一些配对和按键聚合。

或者假设我想对其中一个进行排序并找到median

我认为在这里调用 .toList 或 .toSeq 方法之一是不合法的,因为没有分发常规的 scala 集合。

那么处理 Iterables 的正确方法是什么?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    你几乎肯定不想做groupBy。 Spark 作业中最大的性能问题之一是由于分区和数据局部性差而导致数据在集群周围的混洗。如果你正在做一个groupBy,大概你想在那个键上对你的数据进行分区,并使你的数据尽可能地彼此靠近。所以最后,groupBy 建议您实际上希望您的数据远离分区分布,如果可以避免的话。

    但是你想要的东西需要更加分散。你可能想做这样的事情:

    val rdd: RDD[Int] = ...
    val rdd2: RDD[(Int, Int)] = rdd.map(i => (key(i), i))
    val rdd3: RDD[(Int, Int)] = rdd2.reduceByKey((accumulator, i) => myFunction(accumulator, i))
    

    【讨论】:

    • 你说得对,groupBy 有问题,但是还有其他方法可以获取 Iterable。例如 groupByKey。我的问题是如何处理 Iterables,而不是如何避免它们。我的一个用例是找到 Iterable[Int] 的中位数。
    • 不,不是groupBy“有问题”。您只是从根本上误解了 Spark API。此外,您的Iterable“用例”仅作为您对groupBy 的痴迷而存在。既然您非常确定问题出在 Spark API 而不是您的思维过程,那么您是否至少验证了在 Iterables 上操作是一个问题?如果 Spark 可以使用 Gradient-Boosted Trees 和潜在 Dirichlet 分配进行一些机器学习,我很确定它可以计算出中位数。
    【解决方案2】:

    您可以使用 aggregateByKey 或 reduceByKey transformations 并且为了获取结果,您可以使用 actions like collect

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 2017-02-20
      • 2017-12-20
      • 1970-01-01
      • 2016-12-21
      • 2014-09-13
      • 1970-01-01
      • 2015-08-31
      • 2011-02-26
      相关资源
      最近更新 更多