Spark 2.4.7中spark.sql.parquet.writeLegacyFormat对Decimal无效求助
spark.sql.parquet.writeLegacyFormat 参数生效的因素 Spark 2.4版本的固有限制:Spark 2.4.x里,
spark.sql.parquet.writeLegacyFormat主要针对Timestamp的int96格式转数字格式做控制,对Decimal类型的支持本来就不完善。该版本中Decimal默认仍采用旧的二进制格式存储(就是你看到的AAAAAAAAAAAAAAAAAiVRAA==这类Base64编码的二进制数据),要修改Decimal的Parquet存储格式,需要配合spark.sql.parquet.decimalHandlingMode参数,但这个参数在2.4版本仅支持legacy和correct两种模式,且correct模式的表现和Spark 3.0+版本有差异,不一定能达到预期效果。代码内的配置覆盖:即便你在
spark-defaults.conf和spark-submit中配置了参数,如果作业代码里通过spark.conf.set()重新设置了spark.sql.parquet.writeLegacyFormat或相关Decimal参数,全局配置会被直接覆盖。需要检查代码中是否存在这类硬编码的配置语句。数据库读取阶段的类型映射偏差:读取数据库表时,Spark对Decimal类型的映射可能出现问题。比如数据库中的Decimal精度/范围超出了Spark 2.4默认的Decimal处理范围(Spark 2.4默认Decimal精度为18),会自动转为Double类型,写入Parquet时自然无法按预期的非Legacy格式存储。可以通过
df.printSchema()查看读取后的DataFrame,确认Decimal字段的类型是DecimalType(precision, scale)而非其他类型。自定义写入逻辑绕过全局配置:如果作业中使用了自定义Parquet写入逻辑,比如手动指定了Parquet写入选项,或使用
saveAsTable而非write.parquet(),可能会绕过spark.sql.parquet.writeLegacyFormat的全局配置。比如使用saveAsTable时,表的TBLPROPERTIES中的配置优先级高于全局Spark配置。YARN集群的配置优先级冲突:在YARN模式下,如果集群的全局配置(如yarn-site.xml或集群级别的spark-defaults.conf)存在更高优先级的设置,会覆盖你提交的参数。需要确认YARN节点上的Spark配置是否强制设置了Legacy格式相关参数。
内容的提问来源于stack exchange,提问作者DJ-Glock

