これで、データフレームの列の列を繰り返し処理し、大きな文字列に項目が含まれているかどうかを確認できます@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))
しかし、これは(空と非空)イテレータのリストを返したイテレータ、必須のブール値)。空ではないイテレータ(count
とsize
とlength
が機能しない)をどのように数えるかわかりません。
私は間違っていると思いますか?私がやろうとしていることを達成するためのより良い/より効率的な方法がありますか?
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 |
+---+---------+
と辞書ファイルを考えると、あなたはちょうどあなたがすべき、あなたの他の質問から回答を少し変更することができます
新しい列から真実を数えてみませんか? –
'dict.exists(s.contains(_))'からですか?これは、任意の数の発生に対して真を返すだけです。 – renegademonkey
udfは、真と一致する別の列を返し、偽とは一致しません。あなたは真実を数えることができます。 :)あなたはそれが –