【问题标题】:How to sort an RDD and limit in Spark?如何在 Spark 中对 RDD 和限制进行排序?
【发布时间】:2015-10-05 11:52:10
【问题描述】:

我有 Foo 类的 RDD:class Foo( name : String, createDate : Date )。 我想要一个年龄大 10% 的其他 RDD Foo。 我的第一个想法是按createDate排序并限制为0.1*count,但是没有限制功能。

你有什么想法吗?

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    假设Foo 是这样的案例类:

    import java.sql.Date
    case class Foo(name: String, createDate: java.sql.Date)
    
    1. 使用普通 RDD:

      import org.apache.spark.rdd.RDD
      import scala.math.Ordering
      
      val rdd: RDD[Foo] = sc
        .parallelize(Seq(
          ("a", "2015-01-03"), ("b", "2014-11-04"), ("a", "2016-08-10"),
          ("a", "2013-11-11"), ("a", "2015-06-19"), ("a", "2009-11-23")))
        .toDF("name", "createDate")
        .withColumn("createDate", $"createDate".cast("date"))
        .as[Foo].rdd
      
      rdd.cache()
      val  n = scala.math.ceil(0.1 * rdd.count).toInt
      
      • 数据适合驱动程序内存:

        • 而且你想要的分数比较小

          rdd.takeOrdered(n)(Ordering.by[Foo, Long](_.createDate.getTime))
          // Array[Foo] = Array(Foo(a,2009-11-23))
          
        • 你想要的分数比较大:

          rdd.sortBy(_.createDate.getTime).take(n)
          
      • 否则

        rdd
          .sortBy(_.createDate.getTime)
          .zipWithIndex
          .filter{case (_, idx) => idx < n}
          .keys
        
    2. 使用 DataFrame(注意 - 由于行为受限,这实际上并不是最佳性能)。

      import org.apache.spark.sql.Row
      
      val topN = rdd.toDF.orderBy($"createDate").limit(n)
      topN.show
      
      // +----+----------+
      // |name|createDate|
      // +----+----------+
      // |   a|2009-11-23|
      // +----+----------+
      
      
      // Optionally recreate RDD[Foo]
      topN.map{case Row(name: String, date: Date) => Foo(name, date)} 
      

    【讨论】:

    • 嗨 zero323 你能很快告诉你为什么 DataFrame 的性能在限制操作上不是最理想的吗?在实现方面与 RDD 上的 top 相比有什么区别? @zero333
    • @XinweiLiu 我已经回答了你的问题。我希望它能解释发生了什么。
    • 很好的答案@zero323。但我仍然有同样的问题 xinwei Liu。为什么 df.limit() 很慢?
    • @zero323 请提供更多关于为什么 df.limit(n) 慢的见解。谢谢。
    • 我认为 .zipWithIndex 在这种情况下使用是不安全的。也许zipWithUniqueId 更安全?哦,为什么limit 很慢?
    猜你喜欢
    • 2021-06-04
    • 2014-07-13
    • 1970-01-01
    • 2016-02-19
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多