如何通过AWS Glue实现S3内XML文件转JSON并存入指定目录
S3 XML批量转JSON实现方案
需求背景
- 源存储位置:S3存储桶
Fin-app-ops下路径data-ops/raw-d/中存储的所有XML文件 - 转换规则:将XML文件转换为标准JSON格式
- 目标存储位置:同存储桶下
data-ops/con-d/路径,对应文件替换为.json后缀存储
原有代码问题
- S3资源方法调用错误:boto3 S3资源获取桶实例的方法为
Bucket(),原代码用了小写开头的bucket(),会直接抛出属性错误 - 变量引用混乱:循环遍历返回的是S3对象key字符串存入
datafile变量,后续判断、读取时却使用了未定义的obj变量 - 未定义变量:代码中使用的
bucket_name未赋值,目标文件名拼接处残留无效占位符enter code here,逻辑不完整 - 逻辑缺陷:没有跳过S3前缀过滤返回的空目录对象,没有处理文件名后缀替换,会生成路径错误、后缀异常的目标文件;重复执行JSON序列化操作,浪费资源
- 编码问题:没有指定UTF-8编码,遇到中文、特殊字符时容易出现乱码
可落地实现方案
方案1:修复后可直接运行的Python脚本(适配AWS Glue Python Shell任务)
该方案依赖极少,适合新手快速部署,Glue Python Shell环境自带boto3依赖,仅需补充安装xmltodict即可运行。
import json import boto3 import xmltodict from urllib.parse import unquote_plus # 基础配置 s3 = boto3.client('s3') BUCKET_NAME = 'Fin-app-ops' SOURCE_PREFIX = 'data-ops/raw-d/' TARGET_PREFIX = 'data-ops/con-d/' # 分页拉取源路径下所有文件,避免文件量过大时返回结果被截断 paginator = s3.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket=BUCKET_NAME, Prefix=SOURCE_PREFIX) for page in page_iterator: if 'Contents' not in page: continue for obj in page['Contents']: file_key = unquote_plus(obj['Key']) # 跳过空目录、非XML后缀文件 if file_key.endswith('/') or not file_key.lower().endswith('.xml'): continue # 读取源XML文件内容 s3_resp = s3.get_object(Bucket=BUCKET_NAME, Key=file_key) xml_content = s3_resp['Body'].read() # XML转JSON xml_parsed_dict = xmltodict.parse(xml_content) json_content = json.dumps(xml_parsed_dict, ensure_ascii=False, indent=2) # 拼接目标文件路径 relative_file_name = file_key.replace(SOURCE_PREFIX, '').rsplit('.xml', 1)[0] + '.json' target_key = f"{TARGET_PREFIX}{relative_file_name}" # 上传JSON到目标路径 s3.put_object( Bucket=BUCKET_NAME, Key=target_key, Body=json_content.encode('utf-8'), ContentType='application/json' ) print(f"转换完成: {file_key} -> {target_key}")
运行注意事项:
- 新建Glue任务时选择Python Shell类型,Python版本选择3.9及以上即可,任务绑定的IAM角色需要提前授予
Fin-app-ops桶的读写权限 - 若运行提示缺少xmltodict依赖,直接在Glue任务配置的「高级属性-库」面板中,将
xmltodict添加到pip安装包列表即可,无需手动打包依赖 - 增量运行场景可增加S3对象最后修改时间判断,仅处理上次任务执行后新上传的文件,减少重复计算
方案2:Glue Studio零代码可视化方案(适合无Python基础场景)
如果不想维护代码,可以直接用Glue托管的可视化能力实现:
- 打开Glue Studio新建可视化ETL任务
- 数据源节点选择S3,配置源路径为
data-ops/raw-d/,数据格式选择XML,按照界面提示配置XML解析规则(指定根节点、数据行标签即可) - 无需添加额外转换节点,Glue会自动将XML解析为结构化数据
- 数据目标节点选择S3,配置目标路径为
data-ops/con-d/,数据格式选择JSON,按需配置写入模式(新增/覆盖) - 保存任务后直接运行即可,文件遍历、格式转换、写入逻辑全由Glue托管,适合XML结构统一、文件量级较大的场景
内容的提问来源于stack exchange,提问作者Sarath
相关产品推荐
相关产品推荐

