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

AWS Glue Join操作后输出列乱序及多余符号问题

解决AWS Glue Join后CSV输出列乱、含多余符号的问题

问题原因分析

Join操作会自动合并两个表的Schema,但Glue不会保留你期望的列顺序;如果两个表存在同名列,还会自动添加后缀(比如.1)来区分,这就是你看到多余点号的原因。另外,默认的CSV写入配置可能会给所有列强制添加引号,或者Schema合并后的数据类型识别偏差,也会导致多余引号出现。而单独执行Mapping时,Schema是你手动定义的,所以不会有这些问题。

解决方案步骤

  • 显式指定输出列顺序:Join完成后手动定义需要输出的列名和顺序,避免自动合并的混乱
  • 清理重复列名:对Join后出现的带后缀的列(如id.1)进行重命名或选择保留所需列
  • 调整CSV写入配置:修改写入参数,禁用不必要的全局引号,确保输出格式符合预期

Python脚本示例

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

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

# 读取S3中的两个CSV表
datasource0 = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://your-bucket/path/to/first-csv/"]},
    format="csv",
    format_options={"withHeader": True}
)

datasource1 = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://your-bucket/path/to/second-csv/"]},
    format="csv",
    format_options={"withHeader": True}
)

# 执行Join操作(以inner join为例,关联键为"id")
joined_frame = Join.apply(
    frame1=datasource0,
    frame2=datasource1,
    keys1=["id"],
    keys2=["id"]
)

# 1. 显式定义输出列顺序,同时过滤/重命名重复列
# 替换成你实际需要的列名和顺序,若有重复列直接排除或重命名
selected_frame = SelectFields.apply(
    frame=joined_frame,
    paths=["id", "user_name", "age", "email", "address"]
)

# 可选:如果需要重命名带后缀的列
# renamed_frame = RenameField.apply(frame=joined_frame, old_name="email.1", new_name="work_email")

# 2. 调整CSV写入配置,去除多余引号
glueContext.write_dynamic_frame.from_options(
    frame=selected_frame,
    connection_type="s3",
    connection_options={"path": "s3://your-bucket/path/to/output/"},
    format="csv",
    format_options={
        "withHeader": True,
        "quoteChar": '"',
        "escapeChar": '"',
        "quoteAll": False  # 关键:仅在列值含分隔符时添加引号
    }
)

job.commit()

关键注意点

  • 列顺序控制:一定要通过SelectFields显式指定列的顺序,不要依赖Join后的自动Schema顺序,Glue的Join操作只会按表的原始Schema顺序合并列
  • 重复列处理:提前确认两个表的列名,避免不必要的同名列;如果无法避免,Join后及时重命名或选择保留所需列
  • CSV写入配置:quoteAll设为False是解决多余引号的核心,它会遵循标准CSV格式,仅在列值包含分隔符时才添加引号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:24:21