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|
// +---+--------+
Dank. Es funktioniert für die erste Lösung. zweite und dritte Ergebnisse ist null, – benchuang
Danke, die erste Lösung passt meine Anforderung. Es läuft gut. – benchuang