需要使用过滤器值过滤 Spark 数据框,以迭代多列

时间:2021-02-09 17:45:15

标签: apache-spark apache-spark-sql

我在 Spark 数据框中有以下数据集。我需要根据给定的条件进行过滤:

  • 等于:ID: (6, 7, 8, 9, 13, 15, 16, 18)
  • 不等于:STATE :(Illinois, Oklahoma), CITY: (Orange, Boca_Raton)

我需要遍历这些列以将过滤器值作为键值对而不是对值进行硬编码并过滤数据帧以获得结果 df。

<头>
id 姓名 城市 状态
1 罗森 里士满 弗吉尼亚
3 詹姆森 劳德代尔堡 佛罗里达
4 马琳 华盛顿 哥伦比亚特区
5 象牙色 梅肯 格鲁吉亚
6 托比 San_Diego 加利福尼亚
7 伊萨科 檀香山 伊利诺伊州
8 萨利 橙色 加利福尼亚
9 兰妮 皮奥里亚 俄克拉荷马州
10 布拉德利 塔尔萨 俄克拉荷马州
11 特奥多拉 匹兹堡 宾夕法尼亚
12 本尼迪克塔 坦帕 佛罗里达
13 塞尔玛 Newport_News 加利福尼亚
14 卡琳 燧石 密歇根
15 乔伊 Boca_Raton 加利福尼亚
16 帕蒂 波士顿 马萨诸塞州
17 达格 俾斯麦 北达科他州
18 格林 迪凯特 俄克拉荷马州
19 希尔顿 凤凰 亚利桑那州
20 巴贝特 新奥尔良 路易斯安那州

1 个答案:

答案 0 :(得分:0)

您可以将 isin 函数与值列表一起使用。像这样:

val listIDs = Seq(6, 7, 8, 9, 13, 15, 16, 18)
val listStates = Seq("Illinois", "Oklahoma")
val listCityes = Seq("Orange", "Boca_Raton")

val conditionExpr = Seq(
  col("id").isin(listIDs: _*),
  !col("STATE").isin(listStates: _*),
  !col("CITY").isin(listCityes: _*)
).reduce(_ and _)

val df1 = df.filter(conditionExpr)

df1.show

//+---+------+------------+-------------+
//| id|  NAME|        CITY|        STATE|
//+---+------+------------+-------------+
//|  6|  Toby|   San_Diego|   California|
//| 13| Zelma|Newport_News|   California|
//| 16|Pattie|      Boston|Massachusetts|
//+---+------+------------+-------------+