【问题标题】:Secondary sorting by using join in Spark?在 Spark 中使用 join 进行二次排序?
【发布时间】:2017-02-01 00:25:02
【问题描述】:

在 Spark 中,我想按两个不同的字段对 RDD 进行排序。例如,在这里给出的示例中,我想首先按fieldA 对元素进行排序,然后在其中按fieldB 排序(二次排序)。给定示例中采用的方法是否足够好?我已经测试了我的代码并且它可以工作。但这是一种可靠的方法吗?

// x is of type (key, fieldA) and y of type (key, fieldB) 
val a = x.sortBy(_._2)
// b will be of type (key, (fieldB, fieldA))
val b = y.join(x).sortBy(_._2._1))

所以,例如,我想要一个如下所示的输出。

fieldA, fieldB
2, 10 
2, 11
2, 13
7, 5
7, 7
7, 8
9, 3
9, 10
9, 10

【问题讨论】:

    标签: scala sorting apache-spark rdd


    【解决方案1】:

    但这是一种可靠的方法吗?

    这不可靠。它依赖于一个假设,即在随机播放期间,数据按照分区顺序定义的顺序进行处理。这可能会发生,但不能保证一定会发生。

    换句话说,基于 shuffle 的排序并不稳定。一般来说,有一些方法可以在不执行两次完全随机播放的情况下获得所需的结果,但这些方法级别很低,为了获得最佳性能,需要自定义 Partitioner

    【讨论】:

      【解决方案2】:

      您可以通过以下方式使用sortBy

      y.join(x).sortBy(r => (r._2._2, r._2._1))
      

      一次会进行两次排序。

      【讨论】:

      • 但是为此我猜你必须定义排序变量如何对(A,B)的类型进行排序。不?可能还有其他方法,但我的问题与我正在使用的方法有关,如果那个方法可靠的话。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多