Spark Scala处理Parquet嵌套数据:空值替换为0的实现问题
解决Spark Scala嵌套Parquet数据中Price字段空值替换为0的问题
我来帮你搞定这个问题,针对你这种嵌套结构的Parquet数据,要把price列的空值(不管是字段不存在还是值本身为null)替换成0,有两个简单直接的方案,完全不需要用Try:
方案一:用coalesce函数(最简洁)
coalesce函数的作用是返回传入参数里第一个非null的值,刚好完美适配你的场景——不管sheep.data.price是因为字段不存在变成null,还是本身就是null,都会被替换成0:
import org.apache.spark.sql.functions._ def get: DataFrame = { sheepDF .select( $"sheep.id".as("id"), $"sheep.data.age".as("age"), coalesce($"sheep.data.price", lit(0)).as("price") ) }
方案二:用when+isNull做显式判断
如果你需要更清晰的逻辑表达,可以用when语句检查price是否为null,是的话返回0,否则保留原数值:
import org.apache.spark.sql.functions._ def get: DataFrame = { sheepDF .select( $"sheep.id".as("id"), $"sheep.data.age".as("age"), when($"sheep.data.price".isNull, lit(0)).otherwise($"sheep.data.price").as("price") ) }
为什么你之前的尝试没成功?
isNaN不适用你的场景:isNaN只能识别数值类型的NaN值(比如除法除以0产生的非数字),而你的空值是因为嵌套字段不存在或者值为null,所以isNaN根本检测不到这些情况,得用isNull来判断。hasColumn的类型问题:hasColumn返回的是布尔值,但Spark的DataFrame操作需要的是Column类型的表达式,直接用它自然会报类型不匹配的错误。而上面的方案根本不需要检查字段是否存在——Spark会自动把不存在的嵌套字段解析为null,我们只需要处理这个null就行。
这样处理后,你导出的CSV里price列就不会有空值,所有原本空的位置都会显示0,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Piko Monde
相关产品推荐
相关产品推荐

