我正在使用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))
有人可以帮忙吗?
答案 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程序或将其写入文件系统。 因此,您应该考虑何时使用大型数据集。