如何同时使用两个功能对 RDD 条目进行排序?

Posted

技术标签:

【中文标题】如何同时使用两个功能对 RDD 条目进行排序?【英文标题】:How to sort RDD entries using two features simultaneously? 【发布时间】:2017-07-31 13:25:06 【问题描述】:

我有一个 Spark RDD,我想以有组织的方式对其条目进行排序。假设条目是一个包含 3 个元素 (name,phonenumber,timestamp) 的元组。我想首先根据phonenumber 的值对条目进行排序,然后根据timestamp 的值对条目进行排序,同时尊重而不是更改基于phonenumber 所做的排序。 (所以timestamp 只根据phonenumber 排序重新排列)。是否有 Spark 功能可以做到这一点?

(我正在使用带有 Scala 的 Spark 2.x)

【问题讨论】:

【参考方案1】:

为了对RDD中的多个元素进行排序,可以使用sortBy函数。请在下面找到一些 Python 示例代码。您也可以类似地用其他语言实现。

tmp = [('a', 1), ('a', 2), ('1', 3), ('1', 4), ('2', 5)]

sc.parallelize(tmp).sortBy(lambda x: (x[0], x[1]), False).collect()

问候,

尼拉杰

【讨论】:

【参考方案2】:

您可以在RDD 上使用sortBy 函数,如下所示

val df = spark.sparkContext.parallelize(Seq(
  ("a","1", "2017-03-10"),
  ("b","12", "2017-03-9"),
  ("b","123", "2015-03-12"),
  ("c","1234", "2015-03-15"),
  ("c","12345", "2015-03-12")
))//.toDF("name", "phonenumber", "timestamp")

df.sortBy(x => (x._1, x._3)).foreach(println)

输出:

(c,1234,2015-03-15)
(c,12345,2015-03-12)
(b,12,2017-03-9)
(b,123,2015-03-12)
(a,1,2017-03-10)

如果您有一个带有toDF("name", "phonenumber", "timestamp") 的数据框 然后你可以简单地做

df.sort("name", "timestamp")

希望这会有所帮助!

【讨论】:

以上是关于如何同时使用两个功能对 RDD 条目进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何对类似于链表的条目进行排序?

如何对 32 位数字进行排序以查找唯一条目?

Grails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序

如何防止 Jquery 可排序连接列表中的重复条目?

Spark - 如何使用有状态映射器对已排序的 RDD 进行平面映射?

列出所有网络协议连接,筛选出第6列并按conu对唯一条目进行排序