如何对Spark Scala中包含5个元素的元组RDD进行排序?
如果我有一个包含5个元素的元组RDD,例如。, RDD(双精度、字符串、整数、双精度、双精度) 如何使用第五个元素对RDD进行有效排序如何对Spark Scala中包含5个元素的元组RDD进行排序?,scala,sorting,apache-spark,rdd,Scala,Sorting,Apache Spark,Rdd,如果我有一个包含5个元素的元组RDD,例如。, RDD(双精度、字符串、整数、双精度、双精度) 如何使用第五个元素对RDD进行有效排序 我尝试将此RDD映射到键值对并使用sortByKey,但看起来sortByKey相当慢,它比我收集此RDD并在收集的数组上使用sortWith慢。为什么是这样 非常感谢。您可以通过直接作用于RDD来执行此操作: myRdd.sortBy(_._5) // Sort by 5th field of each 5-tuple 有额外的可选参数来定义排序顺序(“升序
我尝试将此RDD映射到键值对并使用sortByKey,但看起来sortByKey相当慢,它比我收集此RDD并在收集的数组上使用sortWith慢。为什么是这样
非常感谢。您可以通过直接作用于
RDD
来执行此操作:
myRdd.sortBy(_._5) // Sort by 5th field of each 5-tuple
有额外的可选参数来定义排序顺序(“升序”)和分区数。sortByKey是Spark 1.0的唯一分布式排序
您试图对多少数据进行排序?少量将导致更快的本地/集中分拣。如果您尝试对GB和GB的数据进行排序,而这些数据甚至可能不适合单个节点,这就是Spark的亮点所在 如果要按降序排序&如果对应元素的类型为int,则可以使用“-”符号按降序对RDD进行排序 例如: 我有一个带有(String,Int)的元组RDD。要按第二个元素降序排列此RDD
rdd.sortBy(x => -x._2).collect().foreach(println);
rdd.sortBy(x => x._2, false).collect().foreach(println);
我有一个元组的RDD,带有(String,String)。要按第二个元素降序排列此RDD
rdd.sortBy(x => -x._2).collect().foreach(println);
rdd.sortBy(x => x._2, false).collect().foreach(println);
“它比我收集这个RDD并在收集的数组上使用sortWith要慢。”当然是这样。如果你收集数据,所有的数据都在一个节点上,然后你在内存中进行排序,Spark是针对不适合一个节点的大数据集,与单节点计算相比,它有一个(相当大的)开销。如果您没有那么大的数据集,您可能不想使用Spark。这不是一个神奇的“让事情变得更快”的解决方案。谢谢你的解释。谢谢你的回复。我在RDD上尝试了sortBy,但它返回了一个错误:value sortBy不是org.apache.spark.RDD.RDD[(Double,String,Int,Double,Double)]的成员。我使用的是Spark 1.0.1,这就是原因吗?看起来可能是-
sortBy
似乎可以追溯到Spark 1.1.x版感谢您的回复。谢谢。我排序的数据不是很大,可以在内存中处理。也许我应该将数据排序为数组/列表,而不是RDD。