RDD将每个子字符串映射到另一个RDD

时间:2017-03-19 15:30:17

标签: scala apache-spark mapping aggregate rdd

我对函数式编程不太熟悉。我想要做的是获取字符串的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”]

1 个答案:

答案 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"))