从word-Dictionary Line-By Line中提取单词

时间:2016-03-26 16:04:19

标签: scala apache-spark

我有两个文件,一个包含摘要(包含从csv文件中提取的许多行),另一个包含单词列表(在csv文件中的行中)。我读了两个文件,并为每个文件获得了Array [String]:

val summary: Array[String] = ...
val wordList: Array[String] = ...

对于summary中的每一行,我想提取wordList中也存在的单词列表,

summary中的示例数据:

hi how are you
I am good.how about you.
I would like to have tea.

wordList中的示例数据:

good
tea
you
like

预期结果:

you
good,you
like,tea

3 个答案:

答案 0 :(得分:1)

正如有人指出的那样,你不需要Spark:

import scala.collection.mutable.ArrayBuffer

val results = summary.map(l => {
  var result = ArrayBuffer[String]();
  wordList.foreach(w => {if (l.contains(w)) result.append(w)});
  result.toArray.mkString(",")
}).filter(l => l.length > 0)

答案 1 :(得分:0)

这是最后的答案,我想出了:

val broadcast_wordList=sc.broadcast(wordList)

def concat(ss: String*) = ss filter (_.nonEmpty) mkString ", "

val results_part1 = summary_arraylist. repartition(1).map{l=>

var t=broadcast_wordList.value.map(w=>if(l.contains(w)){w}else{""})

print(l)

var tt=t.filter(ll=>ll.length>0).toArray.mkString("|")

concat(l,tt)

答案 2 :(得分:-1)

@David Griffin。当我尝试你的代码,它首先给出错误说RDD不能包含RDD。因此,通过广播worlist,然后在代码中使用广播变量来修改代码。

val broadcast_wordList=sc.broadcast(wordList)

val results = summary_arraylist.map {l=>
val result = ArrayBuffer[String]();
broadcast_wordList.value.foreach(w=> {if(l.contains(w))  result.append(w)});
result.toArray.mkString(",")
 }

因为我想要所有行,即使是空白行(没有匹配),所以我从代码中删除了“过滤器”。 但是,我的输出仍然是空白数组。

这是输出:

enter image description here