簡體   English   中英

Apache Spark SQL數據框按字符串過濾多條規則

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM