Spark 3.3(Python)写入CSV默认修剪字符串字段,如何保留原空格?
解决Spark CSV写入时保留字符串前后空格的问题
问题原因
Spark 3.x的CSV写入器默认启用了ignoreLeadingWhiteSpace和ignoreTrailingWhiteSpace选项(默认值为true),会自动修剪字符串字段的前后空格;同时AWS Glue的DynamicFrame默认也会对字符串进行修剪,这两个环节都可能导致原始空格丢失。
解决方案
1. 修改CSV写入配置,关闭自动修剪
在写入CSV时添加两个关键配置,禁用前后空格的自动修剪:
if not df_repartitioned_app.rdd.isEmpty(): df_repartitioned_app.write.format("csv") \ .option("compression", "gzip") \ .option("header", "true") \ .option("delimiter", "|") \ .option("ignoreLeadingWhiteSpace", "false") \ .option("ignoreTrailingWhiteSpace", "false") \ .save(output_path_app)
2. 确保DynamicFrame转换时不丢失空格
如果AWSGlueDataCatalog_node是从Glue Data Catalog加载的DynamicFrame,默认会自动修剪字符串,需要在加载时关闭该行为:
# 从Data Catalog加载DynamicFrame时禁用自动修剪 AWSGlueDataCatalog_node = glueContext.create_dynamic_frame.from_catalog( database="your_database", table_name="your_table", trim=False # 禁用自动修剪空格 )
若已有现成的DynamicFrame,部分Glue版本支持直接在toDF()转换时指定保留原始值:
df_app = AWSGlueDataCatalog_node.toDF(trim=False)
完整修改后的代码
args = getResolvedOptions(sys.argv, ['target_BucketName', 'JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) # 加载DynamicFrame时禁用自动修剪(根据实际数据源调整) AWSGlueDataCatalog_node = glueContext.create_dynamic_frame.from_catalog( database="your_database", table_name="your_table", trim=False ) # Convert DynamicFrame to DataFrame df_app = AWSGlueDataCatalog_node.toDF() # Repartition the DataFrame to control output files APP df_repartitioned_app = df_app.repartition(10) # Check for empty partitions and write only if data is present if not df_repartitioned_app.rdd.isEmpty(): df_repartitioned_app.write.format("csv") \ .option("compression", "gzip") \ .option("header", "true") \ .option("delimiter", "|") \ .option("ignoreLeadingWhiteSpace", "false") \ .option("ignoreTrailingWhiteSpace", "false") \ .save(output_path_app) job.commit()
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

