Давайте сначала определим нашу patterns
:
val patterns = Seq("foo", "bar")
и создать пример DataFrame
:
val df = Seq((1, "bar"), (2, "foo"), (3, "xyz")).toDF("id", "contents")
Одно простое решение заключается в fold
над patterns
:
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
:
df.where(col("contents").isin(patterns: _*)).show
// +---+--------+
// | id|contents|
// +---+--------+
// | 1| bar|
// | 2| foo|
// +---+--------+
Также можно присоединиться:
val patternsDF = patterns.map(Tuple1(_)).toDF("contents")
df.join(broadcast(patternsDF), Seq("contents")).show
// +---+--------+
// | id|contents|
// +---+--------+
// | 1| bar|
// | 2| foo|
// +---+--------+
Спасибо. Он работает для первого решения. второй и третий результаты: null, – benchuang
Спасибо, первое решение соответствует моему требованию. Это работает хорошо. – benchuang