Scala:根据预定义的Array Spark 1.6中存在的列值过滤DF行

问题描述

我的问题几乎类似于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|
+--------+-----------+
*/