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
相关产品推荐
相关产品推荐

