PySpark如何删除含空Map列的DataFrame行?空Map字面量对比问题
在PySpark中删除含空Map的行的几种方法
哈哈,这个问题我之前也踩过坑!PySpark确实没有Scala里的typedLit来直接生成类型化的空Map,但其实完全不用纠结怎么构造空Map来对比,有更直接的方式解决:
方法一:用size()函数判断Map大小(最通用)
不管你用的是哪个PySpark版本,size()函数都能直接返回Map类型列的键值对数量,空Map的大小就是0,所以直接过滤掉大小为0的行就行:
from pyspark.sql import functions as F # 假设你的DataFrame是df,要检查的Map列名为map_col filtered_df = df.filter(F.size(F.col("map_col")) != 0)
方法二:用Map的isEmpty()方法(PySpark 3.0+适用)
如果你的PySpark版本在3.0及以上,Map类型的列直接支持isEmpty()方法,用取反操作就能过滤掉空Map的行:
filtered_df = df.filter(~F.col("map_col").isEmpty())
要是你确实需要构造类型化的空Map来对比
如果非得构造一个和目标列类型一致的空Map来做相等判断,也可以用create_map()配合类型转换来实现:
from pyspark.sql.types import MapType, StringType, IntegerType # 比如你的Map列是<String, Integer>类型,构造对应的空Map empty_map = F.create_map().cast(MapType(StringType(), IntegerType())) # 过滤掉和空Map相等的行 filtered_df = df.filter(F.col("map_col") != empty_map)
为啥之前用lit({})会报错呢?因为PySpark的lit()没法自动推断空字典对应的Map类型,必须显式指定类型才行,上面的create_map()+cast()就解决了这个问题~
内容的提问来源于stack exchange,提问作者iamyojimbo
相关产品推荐
相关产品推荐

