2017-08-04 2 views
0

これで、データフレームの列の列を繰り返し処理し、大きな文字列に項目が含まれているかどうかを確認できます@raphael-rothおよび@tzach-zoharのおかげでhereを参照してください)。そのため(dictリストを放送含みません)基本的なUDFは次のとおりです。Spark(scala) - DF列を繰り返し、項目の集合から一致する数を数えよう

val checkerUdf = udf { (s: String) => dict.exists(s.contains(_)) } 

df.withColumn("word_check", checkerUdf($"words")).show() 

私がやろうとしています次のことが可能な限り最も効率的な方法で、dictセットから発生する一致の数をもカウントです(私は非常に大きなデータセットとdictファイルを扱っています)。

私は数えるとマップの両方使用して、UDFにfindAllMatchInを使用しようとしている:私は(型の不一致を取得

val checkerUdf = udf { (s: String) => dict.count(_.r.findAllMatchIn(s)) 

// OR 
val checkerUdf = udf { (s: String) => dict.map(_.r.findAllMatchIn(s)) 

しかし、これは(空と非空)イテレータのリストを返したイテレータ、必須のブール値)。空ではないイテレータ(countsizelengthが機能しない)をどのように数えるかわかりません。

私は間違っていると思いますか?私がやろうとしていることを達成するためのより良い/より効率的な方法がありますか?

import org.apache.spark.sql.functions._ 
val checkerUdf = udf { (s: String) => dict.count(s.contains(_)) } 

df.withColumn("word_check", checkerUdf($"words")).show() 

val dict = Set("foo","bar","baaad") 

としてdataframe

として
+---+---------+ 
|id |words | 
+---+---------+ 
|1 |foo  | 
|2 |barriofoo| 
|3 |gitten | 
|4 |baa  | 
+---+---------+ 

と辞書ファイルを考えると、あなたはちょうどあなたがすべき、あなたの他の質問から回答を少し変更することができます

+0

新しい列から真実を数えてみませんか? –

+0

'dict.exists(s.contains(_))'からですか?これは、任意の数の発生に対して真を返すだけです。 – renegademonkey

+0

udfは、真と一致する別の列を返し、偽とは一致しません。あなたは真実を数えることができます。 :)あなたはそれが –

答えて

1

として出力しました
+---+---------+----------+ 
| id| words|word_check| 
+---+---------+----------+ 
| 1|  foo|   1| 
| 2|barriofoo|   2| 
| 3| gitten|   0| 
| 4|  baa|   0| 
+---+---------+----------+ 

回答が役に立ちそうです

+0

ああ私の神それは簡単でしたか?パーフェクト - ありがとう。 – renegademonkey

+0

@renegademonkeyを聞いてうれしいです:)受け入れとupvoteのおかげで:) –

関連する問題