如何在spark中使用RDD划分嵌套数组

时间:2016-09-07 17:27:59

标签: arrays scala apache-spark

我试图在Spark中使用RDD划分嵌套数组。例如,有一个val arr = sc.textFile("filename").map(_.split(" "))包含四个句子,如下所示:

  

"他很好","她很好","我很好","我们很好"

我使用Array[Array[String]] = Array(Array(he, is, good), Array(she, is, good), ... ) 命令得到了这个:

Array(he, is, good)

我想使用每个数组元素(即{{1}}),但我不知道如何划分它。我怎么能分开这个?

2 个答案:

答案 0 :(得分:0)

目前还不清楚你的意思是什么,而且通常在函数式编程语言中,当你想对集合的每个元素做任何事情时(或者可迭代的'),您可以使用map功能。 map根据您传递的函数转换每个元素。例如,在工作表中,您可以执行此操作:

val sentences = Array(Array("he", "is", "good"),
                      Array("she", "is", "very", "good"))

def yodaize(sentence: Array[String]): Array[String] =  {
  val reversed = sentence.reverse
  println("Yoda says, '%s'".format(reversed.mkString(" ")))
  reversed
}

yodaize(Array("I", "am", "small"))

val yodaSentences = sentences.map(yodaize)

函数yodaize做两件事:它反转传递给它的句子,作为副作用打印出反向句子。上面的工作表输出是:

sentences: Array[Array[String]] = [[Ljava.lang.String;@faffecf

yodaize: yodaize[](val sentence: Array[String]) => Array[String]

Yoda says, 'small am I'
res0: Array[String] = [Ljava.lang.String;@4bf1c779

Yoda says, 'good is he'
Yoda says, 'good very is she'
yodaSentences: Array[Array[String]] = [[Ljava.lang.String;@40a19a85

这里很难直接看到,但yodaSentences是每个子阵列颠倒的原始数组:

Array(Array("good", "is", "he"),
      Array("good", "very", "is", "she"))

使用map,您可以传入任何功能。它可以直接转换元素或具有副作用。通过这种方式,函数式语言可以处理每个元素,而无需真正地划分'他们。请注意,flatMapfoldLeftfilter等其他功能可用于对您的集合执行其他类型的排列。

答案 1 :(得分:0)

您可以mapforeach使用ArrayRDD

yourReference.map(arrayOfStrings => arrayOfStrings.mkString)

yourReference.foreach(arrayOfStrings => println(Arrays.toString(arrayOfStrings)))