【问题标题】:Sorting in Spark在 Spark 中排序
【发布时间】:2016-04-23 04:03:09
【问题描述】:

存在一些类似的问题,例如thisthis,但他们无法为我提供足够的帮助。 以下是我的一段代码。

val output = abc.collect()
output.foreach(tup => println(tup._1 + "  " + math.ceil(tup._2 * 1000)/1000))

以下是输出的一部分。

 5         0.835
 1         0.901
 110       0.797
 7         0.821
 11        0.899
 0         0.871
 32        0.313
 78        0.273
 35698     0.333
 119       0.273

我希望以排序形式输出。我试过takeOrdered(n),但它给出的输出不是我需要的。它是排序的,但可能是字符串,而不是数字。有点像

 0          0.871
 1          0.901
 10         1.072
 11         0.899
 110        0.797
 111        0.288
 12         0.288
 123        0.273
 14         0.554
 153        0.228

有什么帮助吗?

【问题讨论】:

  • 也许可以尝试使用数据框,请参阅stackoverflow.com/questions/30332619/…
  • 可能没问题,但我的程序中没有使用 Spark SQL。
  • RDD排序后需要做什么? sortBy 将对其进行排序,就像您链接的问题一样。不清楚你的问题到底是什么。
  • 我只是想对 RDD 进行排序。
  • stackoverflow.com/questions/26387753/… 您可以根据需要调整订购功能。在这种情况下,如果我理解正确 - 将字符串转换为 int 并按它排序。

标签: scala sorting apache-spark


【解决方案1】:

takeOrdered(n)collect() 一起使用存在一些问题。 我试过val output = abc.takeOrdered(10000),效果很好。

【讨论】:

    【解决方案2】:

    您可以先对 RDD 进行排序,然后再创建输出,而不是先从 RDD 生成输出然后应用排序

    val abc=sc.parallelize(Array(("5",0.835),("1",0.901),("110",0.797)))
    abc.map{case (k,v)=>(k.toInt,v)}.takeOrdered(3).foreach(println(_))
    //(1,0.901)
    //(5,0.835)
    //(110,0.797)
    

    【讨论】:

    • 这可能没问题,但输出只是一个示例。实际输出的是一个庞大的数据。所以不是 Array(("5",0.835),("1",0.901),("110",0.797)),而是可以应用于所有元素的一般语句。
    • @Asmat Ali:你能详细说明一下你的评论吗?如果你把上面的代码应用到你心目中的数据集上会出现什么样的问题?
    • 问题是我什至不能将此代码应用到我的数据集,因为数据集有数百万个节点,我不能像你对节点 5、1 和 110 所做的那样在每个节点上应用它("5",0.835),("1",0.901),("110",0.797)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2013-10-26
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多