我对函数式编程不太熟悉。我想要做的是获取字符串的RDD,拆分它们然后将每个单词映射为另一个RDD的条目。我的RDD包含以制表符分隔的字符串。
我接受我要分割的子字符串,并将其作为整个字符串映射到另一个RDD。然后我将字符串收集到主节点,最后我将每个要映射的单词分成另一个RDD。作为一种蛮力方法,我已经这样做了:
var e1String = ""
val e1HashTagTemp = entitySetE1.map{ x=>
var containedEntities = ""
val entityString = x.split("\t")(2).split(" ")
entityString.foreach(word => containedEntities += word.toLowerCase + " ")
containedEntities
}
e1HashTagTemp.collect().foreach(x=> e1String += x)
val e1HashTags = sc.parallelize(e1String.split(" ")).distinct
我很确定这不是这种情况的最佳解决方案。
示例:
[RDD] entitySetE1 = [“test0 \ t test1 \ t这是我要映射的字段\ t test3 \ t test4“,”test0 \ t test1 \ t再次映射\ t test3 \ t test4“]
[RDD] e1HashTagTemp = [“这是我要映射的字段”,“再次映射”]
[String] e1String =“这是我要映射的字段再次映射”
[RDD] e1HashTags = [“this”,“is”。 “the”,“field”,“i”,“want”,“to”,“map”,“again”]
答案 0 :(得分:1)
以下内容会(几乎)得到你想要的东西......
val e1HashTagTemp: RDD[String] = entitySetE1.flatMap(s => s.split("\t")).flatMap(t => t.split(" ")).map(u => u.toLowerCase)
...如果您确实需要过滤掉这些字词,可以添加.filterNot(word => word.contains("test"))
。