Spark Scala中的sortByKey()函数无法正常工作

时间:2015-10-05 17:40:15

标签: scala apache-spark

我正在尝试在以下文本文件上运行sortByKey()函数。

EMP_NAME EMP_ID SALARY
Adam     22      100
Bob      25      102
Bob      28      104
Chris    29      110

我将EMP_NAME作为以下文本文件的键。我正在运行以下命令:textFile.sortByKey() 我得到以下输出:

Bob
Bob
Adam
Chris

感谢帮助。谢谢。

3 个答案:

答案 0 :(得分:6)

如果您使用SparkConffiguration作为

val conf = new SparkConf().setMaster("local")

然后默认创建的分区数为1.

但是如果你正在使用

val conf = new SparkConf().setMaster("local[*]")

并且你有可用于Spark的额外内核,它将根据它对数据进行分区,以便并行执行Spark可以执行的任务。

获取Spark所做的分区数量:

println(partitions.length)
//For my machine it was 2

如果数据已分区,则对中仅分区的元素进行排序,并合并每个分区的结束输出。为避免这种情况,您可以在sortByKey中将numPartition强制为1方法并将数据放入一个分区然后对其进行排序。

textFile.sortByKey(numPartitions = 1).foreach(println)

这将使其分区为1,您将在输入数据中获得正确的排序输出。

答案 1 :(得分:0)

这里我提供数据集和代码来执行按键排序的功能,如果你觉得它没有用,那么请提供给我们代码,我们将研究这个问题。

数据 - > (标签分隔文件)

EMP_NAME    EMP_ID  SALARY
Adam    22  100
Bob 25  102
Bob 28  104
Chris   29  110

代码 - >

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

/*
* @author Kshitij Kulshrestha
*/

object A1 {
def main(args: Array[String]): Unit = {

// set up environment
val sparkHome = "/usr/spark_pack/spark-1.4.1-bin-hadoop2.4/";
val sparkMasterUrl = "spark://SYSTEMX:7077";

val conf = new SparkConf()
.setAppName("A1")
.setMaster("local[2]")
.setSparkHome(sparkHome)

val sc = new SparkContext(conf)

val dataRDD = sc.textFile("src/Source/A1_data").filter { !_.contains("EMP_NAME") }
.map { x =>
{
val temp = x.split("\t")

((temp(0)), (temp(1), temp(2)))
}
}

val sortedDataRDD = dataRDD coalesce(1) sortByKey()
sortedDataRDD foreach (println(_))

}
}

输出 - >

(Adam,(22,100))
(Bob,(25,102))
(Bob,(28,104))
(Chris,(29,110))

答案 2 :(得分:0)

的Python:

 sc.parallelize([['Chris',29,110],['Bob',28,104],['Bob',25,102],['Adam',22,100]]).groupBy(lambda x: x[0]).sortByKey().flatMap(lambda x: list(x[1])).collect()
  

[['Adam',22,100],['Bob',25,102],['Bob',28,104],['Chris',29,110]]

Scala的:

sc.parallelize(List(Array("Chris",29,110),Array("Bob",28,104),Array("Bob",25,102),Array("Adam",22,100))).groupBy(x => x(0).asInstanceOf[String]).sortByKey().flatMap(x=> x._2).collect()
  

Array [Array [Any]] = Array(Array(Adam,22,100),Array(Bob,28,104),Array(Bob,25,102),Array(Chris,29,110))< / p>

如果要将其他列添加到排序条件中,可能需要将其他列作为键的一部分。因此,在上面的例子中,第二列的Bob排序将不存在。