2016-08-23 7 views
1

2番目の列の値がリストの単語で始まるテキストファイルの行をフィルタリングしようとしています。私のような行がある場合RDD.filterで使用する正規表現に基づいて部分文字列を抽出します。

val mylist = ["Inter", "Intra"] 

Cricket Inter-house 

Interリストであるが、その行がRDD.filter操作によってフィルタを取得する必要がありますので、

は私のようなリストを持っています。私は部分文字列を抽出するために"""[A-Za-z0-9]+""".rを使用してみましたが、結果は非空のイテレータである

`[A-Za-z0-9]+` 

:私は、次の正規表現を使用しています。

私の質問は、フィルタ操作で上記の結果にアクセスする方法ですか?

答えて

0

"""[A-Za-z0-9]+"""が任意の単語に一致するため、".* Inter.*".rのような正規表現を作成する必要があります。ここにいくつかの実例があり、それが助けてくれることを願っています:

val mylist = List("Inter", "Intra")  
val textRdd = sc.parallelize(List("Cricket Inter-house", "Cricket Int-house", 
            "AAA BBB", "Cricket Intra-house")) 

// map over my list to dynamically construct regular expressions and check if it is within 
// the text and use reduce to make sure none of the pattern exists in the text, you have to 
// call collect() to see the result or take(5) if you just want to see the first five results. 

(textRdd.filter(text => mylist.map(word => !(".* " + word + ".*").r 
         .pattern.matcher(text).matches).reduce(_&&_)).collect()) 

// res1: Array[String] = Array(Cricket Int-house, AAA BBB) 
0

filterは、filterメソッドに渡された関数がtrueを返すものを削除します。したがって、Regexはあなたが望むものではありません。

val filterFunction: (String, String) => Boolean = 
    (row, candidate) => row.split(" ").tail.head.startsWith(candidate) 

我々はこれはかなり簡単に使用して動作することを自分自身を納得させることができます。その代わり、その行の2番目の列が候補で始まる場合の行を取り、候補文字列に対してそれを比較し、true返す関数を開発してみましょうワークシート:

// Test data 
val mylist = List("Inter", "Intra") 
val file = List("Cricket Inter-house", "Boom Shakalaka") 

filterFunction("Cricket Inter-house", "Inter") // true 
filterFunction("Cricket Inter-house", "Intra") // false 
filterFunction("Boom Shakalaka", "Inter") // false 
filterFunction("Boom Shakalaka", "Intra") // false 

残っているのは、この機能をフィルタで利用することです。基本的には、すべての行について、候補リストのすべての行に対してフィルタをテストする必要があります。それは、候補リストを取って、それに対して機能しているすべてのアイテムをチェックするために「左折」を意味します。いずれかの候補が真報告された場合は、その後、我々は、その行が最終結果からフィルタリングする必要があります知っている:

val result = file.filter((row: String) => { 
    !mylist.foldLeft(false)((x: Boolean, candidate: String) => { 
    x || filterFunction(row, candidate) 
    }) 
}) 

// result: List[String] = List(Boom Shakalaka) 

上記解凍するために少し密集することができます。 filterメソッドには、行をとりブール値を生成する関数が渡されています。その値がtrueになるようにするには、行がGoogleの条件と一致しない場合にのみ値を設定します。我々はすでにfilterFunctionに条件を埋め込んでいます:mylistの項目のすべての組み合わせに対してそれを実行するだけです。

これを行うには、開始値(この場合はfalse)をとり、リストを繰り返し反復してその開始値を更新し、最終結果を返すfoldLeftを使用します。

この値を '更新'するには、行と現在の項目に対してフィルタの機能を実行した結果と開始値を論理的にORする関数を書き込みます(mylist)。

関連する問題