0

我会使用火花数据框来搜索内容'喜欢' ,我们可以使用'或'功能像sql'||'像这样过滤。apache spark sql数据框过滤器按字符串多规则

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

但我必须过滤很多字符串,我怎么能过滤字符串列表或数组到数据框?

感谢

回答

2

让我们先来定义我们的patterns

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

,并创建一个例子DataFrame

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

一个简单的解决方案是在foldpatterns

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| 
// +---+--------+ 
+0

感谢。 它适用于第一种解决方案。 第二和第三个结果为空, – benchuang

+0

谢谢,第一个解决方案符合我的要求。它运作良好。 – benchuang