如何拆分Spark rdd数组[(String,Array [String])]?

时间:2016-04-26 08:47:15

标签: scala apache-spark rdd

我正在练习在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进行排序吗?

4 个答案:

答案 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]
})