[英]Apache Spark SQL dataframe filter multi-rules by string
我想使用Spark数据框按“喜欢”搜索内容,我们可以使用“或”函数做类似SQL的“ ||” 像这样过滤
voc_0201.filter(
col("contents").like("intel").or(col("contents").like("apple"))
).count
但是我必须过滤很多字符串,如何将字符串列表或数组过滤到数据框?
谢谢
首先定义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|
// +---+--------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.