问题描述
我的问题几乎类似于this post
我有一个数据框,我需要过滤出列值不是预定义数组中的子字符串的行。
例如:列表= [“苹果”,“葡萄”,“瓜”]
+--------+-----------+
|quantity| fruit|
+--------+-----------+
| 12| apple|
| 24|green apple|
| 6| grapes|
| 11| mango|
| 12| watermelon|
| 15| muskmelon|
| 22| berries|
+--------+-----------+
使用数组过滤后,我的df应该如下所示:
+--------+-----------+
|quantity| fruit|
+--------+-----------+
| 12| apple|
| 24|green apple|
| 6| grapes|
| 12| watermelon|
| 15| muskmelon|
+--------+-----------+
具有列值“ mango”和“ berries”的行应被过滤掉,因为子字符串在预定义列表中不存在。
spark 1.6中有任何建议或想法吗?
解决方法
使用 .rlike
函数,通过列表中的|
来创建字符串。
Example:
df.show()
/*
+--------+-----------+
|quantity| fruit|
+--------+-----------+
| 12| apple|
| 24|green apple|
| 6| grapes|
| 11| mango|
| 12| watermelon|
| 15| muskmelon|
| 22| berries|
+--------+-----------+
*/
import org.apache.spark.sql.functions._
val list=Seq("apple","grapes","melon").mkString("|")
//list: String = apple|grapes|melon
df.filter(col("fruit").rlike(list)).show()
/*
+--------+-----------+
|quantity| fruit|
+--------+-----------+
| 12| apple|
| 24|green apple|
| 6| grapes|
| 12| watermelon|
| 15| muskmelon|
+--------+-----------+
*/