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

使用AWS Glue Catalog通过AWS Glue Job读取含逗号的S3 CSV文件时解析异常问题

解决AWS Glue Job读取含引号包裹逗号的CSV文件问题

这个问题我之前帮很多人处理过——CSV里字段用引号包裹但包含分隔符的情况,确实会让默认的解析逻辑出错。别担心,AWS Glue完全支持处理这种场景,我分两种常用的实现方式给你讲清楚:

一、用Glue Studio可视化配置Job

如果习惯用可视化界面创建Job,直接在数据源配置里指定引号参数即可:

  • 打开AWS Glue Studio,新建一个Job,选择你的S3 CSV文件作为数据源
  • 在数据源的配置面板中,找到CSV options区域:
    • 确认Delimiter设置为逗号(,)
    • 设置Quote character为双引号(")——这是关键!它会告诉Glue解析器:双引号包裹的内容属于同一个字段,里面的逗号不算分隔符
    • 开启Has header选项,确保表头被正确识别为列名

完成配置后,运行Job就能正确解析第三列的内容了。

二、用PySpark代码编写Glue Job

如果是用代码开发Job,在创建DynamicFrame时指定format options即可:

from awsglue.context import GlueContext
from pyspark.context import SparkContext
from awsglue.utils import getResolvedOptions
import sys

# 初始化上下文
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# 读取S3上的CSV文件,指定解析参数
dynamic_frame = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://your-bucket-name/path/to/your/file.csv"]},
    format="csv",
    format_options={
        "withHeader": True,
        "delimiter": ",",
        "quoteChar": "\"",
        # 如果你的字段内部存在转义的双引号(比如"COMMENT1""COMMENT2"),可以添加下面这行
        # "escapeChar": "\""
    }
)

# 转换为Spark DataFrame查看解析结果
df = dynamic_frame.toDF()
df.show(truncate=False)

参数说明:

  • quoteChar: 指定双引号作为字段的包裹符号,解析时会忽略引号内部的分隔符
  • withHeader: 读取文件第一行作为列名
  • escapeChar: 可选参数,用于处理字段内部包含双引号的场景(例如用两个双引号表示一个普通双引号)

三、同步配置Glue Catalog表(可选)

如果你需要把解析后的元数据存入Glue Catalog,或者后续直接从Catalog读取该表,记得在创建Catalog表时配置对应的参数:

  • 在Glue控制台创建表时,选择CSV格式
  • 进入表的Properties页面,添加以下键值对:
    • skip.header.line.count = 1
    • delimiter = ,
    • quoteChar = "

这样后续从Catalog读取该表时,Glue会自动应用这些解析规则,无需重复配置。

测试一下你提供的样本数据,解析后第三列的内容会完整保留为COMMENT1,COMMENT2,不会被拆分成多列。

内容的提问来源于stack exchange,提问作者Data girl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:07:42