You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark DataFrame过滤MapType列含指定键及键值非空的行

嗨,我来帮你搞定这两个MapType列的过滤需求,结合你给的示例数据,咱们一步步来:

首先先把示例数据调整成可直接运行的Scala代码格式:

val ds = Seq(
  (1, Map("foo" -> (1, "a"), "bar" -> (2, "b"))),
  (2, Map("foo" -> (3, "c"))),
  (3, Map("bar" -> (4, "d")))
).toDF("id", "alpha")
问题1:筛选仅包含"bar"作为键的行

要实现这个需求,咱们需要确认两件事:一是Map里确实有"bar"这个键,二是Map里没有其他任何键。这里有两种顺手的写法:

写法一:通过大小+包含判断

先判断Map的元素数量是1,再确认包含"bar"键,这样就能保证只有"bar"这一个键:

import org.apache.spark.sql.functions._

val onlyBarRows = ds.filter(
  size(col("alpha")) === 1 && col("alpha").contains("bar")
)
onlyBarRows.show()

写法二:直接比较键集合

Spark支持直接获取Map的键集合,咱们可以直接和Set("bar")做比较,更直观:

val onlyBarRowsAlternative = ds.filter(
  col("alpha").keySet === lit(Set("bar"))
)
onlyBarRowsAlternative.show()

两种写法都会得到id=3的那一行结果。

问题2:筛选包含"bar"键且对应值不为null的行

这个需求要分两步判断:首先Map里必须存在"bar"键,其次这个键对应的值不能是null。代码实现如下:

val barWithNonNullValue = ds.filter(
  col("alpha").contains("bar") && col("alpha")("bar").isNotNull
)
barWithNonNullValue.show()

运行后会保留id=1和id=3的行——id=1的Map里有"bar"且值不为null,id=3同理,而id=2的Map没有"bar"键,直接被排除。

内容的提问来源于stack exchange,提问作者Hugo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:10:17