我正在尝试在以下文本文件上运行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
感谢帮助。谢谢。
答案 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排序将不存在。