Spark SQL查询返回非空但长度为0的字符串列问题
Spark字符串列非空但长度为0的原因与处理方案
原因解析
你遇到的情况核心在于空字符串("")和SQL中的NULL是完全不同的概念:
- Parquet文件里的这些记录,
col_a存储的是空字符串,而非NULL缺失值。 - Spark的
col_a is not null条件只会排除NULL值,空字符串属于有效字符串范畴,因此会被保留;而length(col_a)对空字符串计算结果就是0,最终出现你看到的查询结果。 - 这类情况通常是上游数据写入Parquet时,将空字符串而非
NULL写入字段,或者原始数据本身就存在空字符串导致的。
处理方法
1. 直接过滤空字符串记录
如果业务上不需要保留空字符串的记录,修改查询条件,同时排除空字符串即可:
select col_a, length(col_a) from df where col_a is not null and col_a != ''
如果字段存在全空格的无效值,也需要过滤的话,可以用trim()处理后判断:
select col_a, length(col_a) from df where col_a is not null and trim(col_a) != ''
2. 将空字符串转换为NULL
如果业务逻辑中空字符串等价于缺失值,可以先把空字符串转为NULL,再进行后续处理:
Scala代码示例:
import org.apache.spark.sql.functions.{when, lit, col} val cleanedDf = df.withColumn("col_a", when(col("col_a") === "", lit(null)).otherwise(col("col_a")))
SQL语句示例:
select case when col_a = '' then null else col_a end as col_a, length(col_a) from df where col_a is not null and col_a != ''
内容的提问来源于stack exchange,提问作者Dozel
相关产品推荐
相关产品推荐

