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

