Antwort

2

Lassen Sie uns zuerst unsere patterns definieren:

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

und ein Beispiel erstellen DataFrame:

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

Eine einfache Lösung ist es, fold über patterns:

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

df.where(expr).show 

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

Ein weiterer ist für reguläre Ausdrücke zu bauen und verwenden rlike:

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

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

PS: die obige Lösung kann nicht funktionieren, wenn dies nicht einfach wörtlichen ist.

schließlich für einfache Muster können Sie isin verwenden:

df.where(col("contents").isin(patterns: _*)).show 

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

Es ist auch möglich beitreten:

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

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

Dank. Es funktioniert für die erste Lösung. zweite und dritte Ergebnisse ist null, – benchuang

+0

Danke, die erste Lösung passt meine Anforderung. Es läuft gut. – benchuang