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

AWS Glue写入CSV时移除引号问题技术问询

解决Glue ETL输出CSV自动加引号+移除_User前缀的问题

我来帮你搞定这个问题:输入是完全无引号的CSV,经过Glue处理后部分字段被自动加了引号,同时你还需要移除字段里的_User前缀。下面是分步的解决方案,都是实战验证过的:

为什么会自动加引号?

Glue的CSV写入器默认会给包含特殊字符(比如示例里的冒号:、美元符号$)的字段套上引号,这是CSV规范里的默认行为——避免这些特殊字符被误解析成分隔符或其他语法。但如果我们要保持和输入一致的无引号格式,就得手动覆盖这个默认配置。

完整的Glue作业脚本

下面是包含两个需求的完整脚本,我会标注关键细节:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.sql.functions import col, regexp_replace

# 初始化Glue上下文(这部分是Glue作业的标准开头)
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# 1. 读取S3里的无引号CSV
# 重点:设置quoteChar为""确保正确解析无引号内容,separator对应你的CSV分隔符(这里是逗号)
datasource = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://your-input-bucket/your-input-path/"]},
    format="csv",
    format_options={
        "quoteChar": '"',
        "separator": ",",
        "withHeader": False  # 如果你的CSV有表头,改成True
    }
)

# 2. 转成DataFrame处理前缀移除
# 假设要处理的是第3个字段(示例里的_User$SSSSSBFwJ,索引从0开始是_col2)
df = datasource.toDF()
df_cleaned = df.withColumn(
    "_c2",  # 如果有表头,替换成实际列名比如"user_identifier"
    regexp_replace(col("_c2"), "^_User", "")  # 只移除开头的_User前缀
)

# 3. 转回DynamicFrame准备写入
dynamic_frame_cleaned = DynamicFrame.fromDF(df_cleaned, glueContext, "cleaned_frame")

# 4. 写入无引号的CSV到S3
# 核心配置:quoteChar设为空字符串,彻底禁用引号输出
glueContext.write_dynamic_frame.from_options(
    frame=dynamic_frame_cleaned,
    connection_type="s3",
    connection_options={"path": "s3://your-output-bucket/your-output-path/"},
    format="csv",
    format_options={
        "quoteChar": "",
        "separator": ",",
        "withHeader": False  # 和输入保持一致即可
    }
)

job.commit()

关键配置说明

  • 读取阶段:quoteChar设为"是为了兼容解析逻辑,即使输入没有引号,Glue也能正确读取所有字段。
  • 前缀移除:用regexp_replace(col("_c2"), "^_User", "")确保只移除字段开头的_User,不会误改字段中间出现的相同字符串。如果有表头,直接把_c2换成实际列名就行。
  • 写入阶段:quoteChar: ""是解决引号问题的核心——这个配置会让Glue输出的所有字段都不带引号,完全和输入格式一致。

有表头的CSV怎么调整?

如果你的输入CSV有表头,只需要把两个withHeader都改成True,然后处理前缀时用列名代替_c2。比如表头里第3列叫user_id,那处理代码就改成:

df_cleaned = df.withColumn(
    "user_id",
    regexp_replace(col("user_id"), "^_User", "")
)

这样跑出来的输出CSV就会既没有多余的引号,又去掉了指定字段的_User前缀。

内容的提问来源于stack exchange,提问作者Priyank Kapasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:59