将RDD [String]类型文本拆分为RDD [String]类型的单词(Scala,Apache Spark)

时间:2017-05-11 19:18:03

标签: arrays string scala apache-spark rdd

我正在使用Apache Spark和Scala,并在文本中有一行文本RDD [String]。我想把它分成单词(就像在每个空格中拆分一样),然后输出另一个由单独的单词组成的RDD [String]。

我尝试在每个空间拆分文本,但不知道如何将Array [String]转换为RDD [String]。

val lines = sc.textFile(filename)

val words = lines.map(line => line.split('_'))

我也试过

val words = lines.flatMap(line => line.split('_')).collect()

但是我仍然得到一个数组[String]

作为一种不同的方法,我试图获取空间的索引,然后在这些索引处拆分行,但是每次必须处理具有不同数量和空间位置的单独行并且获取来自RDD [Array [Int]]的Array [Int]。

val spaces = lines.map(line => line.zipWithIndex.filter(_._1 == ' ').map(_._2))

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

如果flatmap操作返回某个集合但您希望将结果展平为所有单个元素的rdd,请使用map

val words = lines.flatMap(line => line.split('_'))

将行转换为RDD[String],其中rdd中的每个sting都是单个单词。 split会返回所有单词的数组,因为它在flatmap中的结果是"展平"进入个别元素。

您已经拥有此功能,但最后添加了collect()collect()从RDD获取所有数据并将其加载到群集上的Array中。换句话说,它将RDD转换为数组。如果你想让事情留在RDD,你需要做的就是不要打电话给collect()

答案 1 :(得分:0)

当我们从sparkContext.textFile开始阅读时,我们已经RDD[String]了 在您的情况下

val lines = sc.textFile(filename)

你已经RDD[String]了 和map函数

val words = lines.map(line => line.split('_'))

String的{​​{1}}分割为RDD[String],从而将其转为Array
你还有一个RDD[Array[String]]
现在,如果您正在寻找RDD,您可以

RDD[RDD[String]]

val words = lines.map(line => sparkContext.parallelize(line.split('_'))) 将每个拆分的单词输出为单独的行,以便

flatMap

应为val words = lines.flatMap(line => line.split('_'))


RDD[String]collect()变为RDD[String]

答案 2 :(得分:0)

val lines = sc.parallelize(List("there are", "some words"), 2)

val words1 = lines.map(l => l.split(" ")) // => words1: Rdd[Array[String]] => word1.collect => Array(Array(there, are), Array(some, words))

val words2 = lines.flatMap(_.split(" ") // words2: Rdd[String] => words2.collect => Array(there, are, some, words)

Spark操作有两种类型:转换和操作。 转换是惰性求值,其他Actions将最终结果返回给Driver程序或将其写入文件系统。 因此,您应该考虑何时使用大型数据集。