AWS Glue处理xml需借助spark-xml库:配置依赖后用Spark DataFrame读取(指定rowTag、attributePrefix),再转DynamicFrame;嵌套结构可用Relationalize或explode展开,写入前建议重命名属性字段并清理空值。

在AWS Glue中处理XML数据需要额外配置,因为Glue原生的爬虫和Spark作业默认不直接支持xml解析。核心思路是:用第三方库(如databricks/spark-xml)扩展Spark上下文,再通过动态帧或DataFrame读取并转换XML内容。
使用Spark-XML库读取XML文件
AWS Glue底层基于apache Spark,但默认不包含XML解析器。需显式添加spark-xml依赖:
- 在Glue作业配置中,于“Jar files”字段填入maven坐标:
com.databricks:spark-xml_2.12:0.17.0(注意scala和Spark版本匹配,Glue 4.0+用Scala 2.12/Spark 3.3) - 或上传JAR包至S3,在作业参数中指定
--extra-jars s3://your-bucket/spark-xml_2.12-0.17.0.jar - 代码中不能直接用
glueContext.create_dynamic_frame_from_options读XML,而应切换到Spark DataFrame API:
示例(PySpark):
df = spark.read.format(“xml”)
.option(“rowTag”, “record”)
.option(“attributePrefix”, “@”)
.load(“s3://my-bucket/data/input.xml”)
其中rowTag指定每条记录的根标签名(如),attributePrefix用于区分属性与子元素(避免字段名冲突)。
将XML转为DynamicFrame进行后续etl
Glue作业常依赖DynamicFrame提供的自动schema推断和内置转换函数(如applyMapping、ResolveChoice)。可将DataFrame转为DynamicFrame:
- 先调用
glueContext.create_data_frame_from_catalog或手动读取后,用DynamicFrame.fromDF(df, glueContext, "xml_source")封装 - 注意:若XML含嵌套结构(如多层子节点或重复元素),
spark-xml会生成复杂类型(StructType、ArrayType),DynamicFrame能保留这些结构,方便后续使用Relationalize展开 - 常见问题:空值或缺失标签可能导致列类型不一致,建议加
.option("NULLValue", "null")统一处理
处理嵌套与重复XML结构
真实XML常含层级嵌套(如)。直接读取会产生嵌套字段,需展开:
- 用
Relationalize将嵌套结构扁平化:dyf_rel = Relationalize.apply(frame = dyf, staging_path = "s3://bucket/staging/", transformation_ctx = "rel") - 对特定数组字段单独explode:
df_exploded = df.withColumn("item", explode(col("items.item"))) - 若需保留父子关系,可在explode后添加
monotonically_increasing_id()作为临时主键关联
写入目标格式的注意事项
转换后的数据可输出为Parquet、jsON、csv等。写入时注意:
- XML属性(如
)经attributePrefix="@id"后变为@id字段,写入Parquet时建议重命名去掉@符号,避免下游工具兼容问题 - 写入S3前,用
dropNullFields或ApplyMapping清理无用字段,减少存储开销 - 若目标是Athena查询,推荐输出为Parquet + Glacier-compatible partitioning,并更新Glue Data Catalog