AWS Glue导出Spark DataFrame为CSV:NULL值不添加双引号的实现方法
解决方案
问题出在quoteAll=True会强制给所有输出字段(包括你指定的nullValue='')加上双引号,所以NULL值会被转成""。要实现非NULL值带双引号、NULL值留空的需求,得换个思路:手动给非NULL字段添加双引号,然后关闭Spark CSV的自动引号功能。
具体步骤如下:
- 预处理所有列:遍历DataFrame的每一列,对非NULL值前后拼接双引号,NULL值保持原样。
- 导出CSV时关闭自动引号:设置
quoteMode='NONE',同时指定nullValue=''让NULL值输出为空。
代码示例
from pyspark.sql.functions import col, when, concat, lit # 遍历所有列,给非NULL值添加双引号 for col_name in df.columns: df = df.withColumn( col_name, when(col(col_name).isNotNull(), concat(lit('"'), col(col_name), lit('"'))).otherwise(col(col_name)) ) # 导出CSV,关闭自动引号,设置NULL值为空 df.coalesce(1).write.format("csv").mode('overwrite').options( header='true', path=output_path, nullValue='', quoteMode='NONE', escape='"' # 如果字段值本身包含双引号,用这个参数转义内部引号 ).save()
说明
- 手动拼接双引号确保只有非NULL值带引号,NULL值保留原生状态;
quoteMode='NONE'禁止Spark自动给任何字段加引号,避免和我们手动添加的引号冲突;- 如果你的数据中存在双引号(比如字段值是
he"llo),escape='"'会把内部的双引号转义为\",最终输出为"he\"llo",符合CSV规范。
内容的提问来源于stack exchange,提问作者msa
相关产品推荐
相关产品推荐

