Databricks中Spark DataFrame日期列含'-'值的过滤问题
解决Spark DataFrame中'-'值过滤无结果的问题
常见原因及处理方案
1. 字符串包含不可见的前后空格
肉眼看到的'-'可能实际带有前后空格,导致直接匹配失败,可先去除空格再过滤:
# Python 示例:筛选navdt为'-'的记录 from pyspark.sql import functions as F df.filter(F.trim(df.navdt) == '-').show() # 筛选navdt不为'-'的记录 df.filter(F.trim(df.navdt) != '-').show()
// Scala 示例:筛选navdt为'-'的记录 import org.apache.spark.sql.functions.trim df.filter(trim($"navdt") === "-").show() // 筛选navdt不为'-'的记录 df.filter(trim($"navdt") =!= "-").show()
2. 列数据类型非字符串
如果navdt被定义为日期类型,原始的'-'无法被解析为有效日期,会被转为null,此时需先将列转为字符串类型再匹配:
# Python 示例:转字符串后筛选'-' df.filter(F.col("navdt").cast("string") == '-').show() # 转字符串后筛选非'-'的记录 df.filter(F.col("navdt").cast("string") != '-').show()
// Scala 示例:转字符串后筛选'-' import org.apache.spark.sql.types.StringType df.filter($"navdt".cast(StringType) === "-").show() // 转字符串后筛选非'-'的记录 df.filter($"navdt".cast(StringType) =!= "-").show()
3. 排查值的真实形态
如果以上方法无效,可先查看该列的实际值特征,确认是否有隐藏字符:
# Python 示例:查看不同值的长度 df.select("navdt", F.length("navdt").alias("str_length")).distinct().show()
通过字符串长度判断是否存在异常字符,再针对性调整过滤逻辑。
内容的提问来源于stack exchange,提问作者NullValue
相关产品推荐
相关产品推荐

