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
相关产品推荐
相关产品推荐

