2017-03-19 11 views
1

私は関数型プログラミングに慣れていません。私がしたいことは、文字列のRDDを取り出し、それらを分割し、各単語を別の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 \トンtest1の\トンこれは私が\トンTEST3 \トン TEST4マップするフィールドである"、「TEST0 \トンtest1の\トン、これは私は再びこれをマップ " "マップするフィールドである"]

[文字列] e1String =" この "

[RDD] e1HashTagTemp = []" \トンTEST3 \トンTEST4再びこれをマッピングします私は地図をもう一度マップしたいフィールドです "

[RDD] e1HashTags = ["this"、 "is"。 「」、「フィールド」、「i」は、「欲しい」、「に」、「もう一度」、「マップ」

答えて

1

次のようなものは、(ほぼ)あなたが欲しいものを得るでしょう...

val e1HashTagTemp: RDD[String] = entitySetE1.flatMap(s => s.split("\t")).flatMap(t => t.split(" ")).map(u => u.toLowerCase) 

...本当にそれらの単語を除外する必要がある場合は.filterNot(word => word.contains("test"))を追加できます。

+0

私の基準で分割するために少し修正しました: entitySetE1.map(s => s.split( "\ t")(2))... おかげさまで、ありがとうございました。 –

関連する問題