0

Я бы использовал световой информационный кадр для поиска содержимого по 'like' , и мы можем использовать функцию 'или', как sql '||' для фильтрации.apache spark sql dataframe filter multi-rules by string

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

Но я должен фильтровать много строк, как я мог бы отфильтровать список Строка или массив в dataframe?

Благодаря

ответ

2

Давайте сначала определим нашу 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| 
// +---+--------+ 
+0

Спасибо. Он работает для первого решения. второй и третий результаты: null, – benchuang

+0

Спасибо, первое решение соответствует моему требованию. Это работает хорошо. – benchuang

Смежные вопросы