我正在练习在Spark shell中进行排序。我有一个大约10列/变量的rdd。我想在第7列的值上对整个rdd进行排序。
rdd
org.apache.spark.rdd.RDD[Array[String]] = ...
从我收集的方式来看,使用sortByKey,而sortByKey只能用于对。所以我映射它所以我有一对由column7(字符串值)和完整的原始rdd(字符串数组)组成
rdd2 = rdd.map(c => (c(7),c))
rdd2: org.apache.spark.rdd.RDD[(String, Array[String])] = ...
然后我应用sortByKey,仍然没问题......
rdd3 = rdd2.sortByKey()
rdd3: org.apache.spark.rdd.RDD[(String, Array[String])] = ...
但是现在如何从rdd3(Array [String])拆分,收集和保存已排序的原始rdd ?每当我尝试在rdd3上进行拆分时,它都会给我一个错误:
val rdd4 = rdd3.map(_.split(',')(2))
<console>:33: error: value split is not a member of (String, Array[String])
我在这里做错了什么?还有其他更好的方法可以在其中一个列上对rdd进行排序吗?
答案 0 :(得分:2)
您对rdd2 = rdd.map(c => (c(7),c))
所做的是将其映射到元组。
rdd2: org.apache.spark.rdd.RDD[(String, Array[String])]
正如它所说:)。
现在,如果你想分割你需要从这个元组中获取它的记录。
你可以再次映射,只取元组的第二部分(这是Array [String] ...的数组),如下所示:rdd3.map(_._2)
但我强烈建议使用try rdd.sortBy(_(7))
或类似的东西。这样你就不需要用元组等来打扰自己了。
答案 1 :(得分:2)
如果你想使用数组中的第7个字符串对rdd进行排序,你可以直接通过
来完成rdd.sortBy(_(6)) // array starts at 0 not 1
或
rdd.sortBy(arr => arr(6))
这将为您节省进行多次转换的所有麻烦。 rdd.sortBy(_._7)
或rdd.sortBy(x => x._7)
无法工作的原因是因为您不是如何访问数组中的元素。要访问数组的第7个元素,例如arr
,您应该arr(6)
。
为了测试这一点,我做了以下事情:
val rdd = sc.parallelize(Array(Array("ard", "bas", "wer"), Array("csg", "dip", "hwd"), Array("asg", "qtw", "hasd")))
// I want to sort it using the 3rd String
val sorted_rdd = rdd.sortBy(_(2))
结果如下:
Array(Array("ard", "bas", "wer"), Array("csg", "dip", "hwd"), Array("asg", "qtw", "hasd"))
答案 2 :(得分:1)
这样做:
val rdd4 = rdd3.map(_._2)
答案 3 :(得分:0)
我以为你不熟悉Scala, 因此,下面应该可以帮助您了解更多,
rdd3.map(kv => {
println(kv._1) // This represent String
println(kv._2) // This represent Array[String]
})