You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:57:39