0

spark dataframeを使用して 'like'でコンテンツを検索します 'or'関数は 'sql'このようにフィルタリングするapache spark sql dataframe複数のルールを文字列でフィルタリングする

voc_0201.filter(col("contents").like("intel").or(col("contents").like("apple"))).count 

しかし、多くのStringsをフィルタリングする必要があります。どのようにしてStringリストや配列をデータフレームにフィルタリングできますか?

おかげ

答えて

2

てみましょう最初の私たちのpatterns定義:

val patterns = Seq("foo", "bar") 

をし、例DataFrame作成:

val df = Seq((1, "bar"), (2, "foo"), (3, "xyz")).toDF("id", "contents") 

一つの簡単な解決策はpatternsfoldにある:

val expr = patterns.foldLeft(lit(false))((acc, x) => 
    acc || col("contents").like(x) 
) 

df.where(expr).show 

// +---+--------+ 
// | id|contents| 
// +---+--------+ 
// | 1|  bar| 
// | 2|  foo| 
// +---+--------+ 

もう一つは、正規表現を構築し、rlikeを使用することです:

val expr = patterns.map(p => s"^$p$$").mkString("|") 
df.where(col("contents").rlike(expr)).show 

// +---+--------+ 
// | id|contents| 
// +---+--------+ 
// | 1|  bar| 
// | 2|  foo| 
// +---+--------+ 

PS:これは文字通り単純ではない場合は、上記の溶液は動作しない場合があります。

最後に単純なパターンのためにあなたはisinを使用することができます。

val patternsDF = patterns.map(Tuple1(_)).toDF("contents") 
df.join(broadcast(patternsDF), Seq("contents")).show 

// +---+--------+ 
// | id|contents| 
// +---+--------+ 
// | 1|  bar| 
// | 2|  foo| 
// +---+--------+ 
+0

感謝を:

df.where(col("contents").isin(patterns: _*)).show // +---+--------+ // | id|contents| // +---+--------+ // | 1| bar| // | 2| foo| // +---+--------+ 

参加することも可能です。 これは最初の解決策として機能します。 2番目と3番目の結果がnullです。 – benchuang

+0

ありがとうございます。最初の解決策は私の要求に合っています。それはうまくいく。 – benchuang

関連する問題