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

时间:2017-07-31 13:25:06

标签: scala apache-spark rdd apache-spark-2.0

我有一个Spark RDD,其条目我想以有条理的方式排序。让我们说条目是一个包含3个元素(name,phonenumber,timestamp)的元组。我希望先根据phonenumber的值对条目进行排序,然后根据timestamp的值进行排序,同时尊重而不是更改基于phonenumber的排序。 (因此timestamp仅根据phonenumber排序重新排列。是否有Spark函数来执行此操作?

(我正在使用Spark 2.x和Scala)

2 个答案:

答案 0 :(得分:4)

为了在RDD中基于Multiple元素进行排序,您可以使用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()

此致

Neeraj

答案 1 :(得分:1)

您可以sortBy使用RDD功能,如下所示

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")

希望这有帮助!