我有两个文件,一个包含摘要(包含从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
答案 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(",")
}
因为我想要所有行,即使是空白行(没有匹配),所以我从代码中删除了“过滤器”。 但是,我的输出仍然是空白数组。
这是输出: