具有10个以上元素的密钥的SortByKey()

时间:2017-02-27 02:52:01

标签: scala sorting apache-spark rdd

我一直在使用sortByKey()来排序我的键值,这是一个元组。如果元组的大小小于9,那么sortByKey函数可以正常工作。但是在大小为10时,sortByKey()方法失败了。 我们如何打印排序大小为10或更大的元组。

如果我使用大小为9的密钥对RDD进行如下打印的工作示例:

scala> freq_9s
res31: org.apache.spark.rdd.RDD[((Int, Int, Int, Int, Int, Int, Int, Int, Int), Int)]
scala> var frequent_movie_9s_count=freq_9s.count().toInt

scala> printf(freq_9s.sortByKey().take(frequent_movie_9s_count).map({case (x,_) => s"$x" }).mkString(","))
(98,102,103,107,108,109,112,113,114),(98,102,106,107,108,109,112,113,114),(98,102,107,108,109,112,113,114,115),(99,100,102,103,104,107,108,110,114),(99,100,102,103,104,107,108,110,116),(99,100,102,103,104,107,108,114,116))

我想做同样的事情,但这次我的RDD看起来:

scala> freq_10s
res31: org.apache.spark.rdd.RDD[((Int, Int, Int, Int, Int, Int, Int, Int, Int, Int), Int)] 

1 个答案:

答案 0 :(得分:2)

OrderedRDDFunctions.sortByKey取决于隐式Ordering[K],Scala仅为Tuples提供排序Tuple9

对于较大的元组,您必须提供自己的隐式排序,例如使用内置的Orderings作为模板。

implicit val ordTN: Ordering[(T1, T2, ..., TN) = ???

您还可以转换为DataFrame并在需要时转换回RDD

freq_9s.orderBy($"k").as[((Int, ..., Int), Int)].rdd