2017-08-24 17 views
0

UDF関数を使用して、wordsの単語セットを反復するスパークデータフレームの文字列に適用します。特定の列の文字列がセットからの単語のいずれかが含まれている場合(下記参照)を求める:Spark(scala)dataframes - 指定された文字列に含まれるセットからの単語のリストを返す

それはある wordsセット内のすべての項目のリストを返すように私はこの機能を変更する必要がありますどのように
udf { (s: String) => words.value.exists(word => s.contains(word)) } 

文字列に見つかりましたか?

私はwhenotherwiseを使用して試してみました:

udf { (s: String) => when(words.value.exists(word => s.contains(word)), word).otherwise(null) } 

しかし、私はtype mismatchを取得し、とにかく、私はこれが唯一の最初の試合を返すと思います。私はスカラとスパークを学んでいるので、どんな提案も大歓迎です。

答えて

2

あなたはプレーンなScalaの関数であるべき、ここで使用しているudf関数に渡される引数 - Columnオブジェクトを返しますwhenのようなSQL関数のいずれかを使用、これらの機能の意図した戻り値の型ではありません(彼らは返す必要がありますプリミティブ、配列、マップ、ケースクラスなどのSpark DataFramesのデータ型としてサポートされています)。

したがって、実装が簡単であろう:

udf { (s: String) => words.value.filter(word => s.contains(word)) } 

これは、入力タイプString、得られたカラムは、AB Arrayカラムであろう意味outpurタイプSeq[String]とUDFを作成します。例えば

val words = sc.broadcast(Seq("aaa", "bbb")) 
val udf1 = udf { (s: String) => words.value.filter(word => s.contains(word)) } 

Seq("aaabbbb", "bbb", "aabb").toDF("word").select(udf1($"word")).show() 
// +----------+ 
// | UDF(word)| 
// +----------+ 
// |[aaa, bbb]| 
// |  [bbb]| 
// |  []| 
// +----------+ 
+0

おかげ@Tzach - 本当であるにはほとんど余りに簡単に聞こえます。私はこれを実行してエラーを受け取りました( 'java.lang.UnsupportedOperationException:型scala.collection.immutable.Set [String]のスキーマはサポートされていません ')。私の「言葉」が不変のセット(放送されている)であることが重要ですか? – renegademonkey

+1

はい、 'words'が' Set [String] 'の場合、UDFの戻り型も' Set [String] 'になります。これは、サポートされているDataFrame型ではありません。これを解決するには、単純に結果を 'Seq'に変換します:' udf {(s:String)=> words.value.filter(word => s.contains(word))。toSeq} ' –

関連する問題