AWS Glue自定义JSON分类器提取JSON数组值路径不生效问题咨询
AWS Glue JSON分类器JSONPath路径不生效的规则说明
核心原因
该现象由AWS Glue内置JSON分类器未公开的隐含规则导致,和JSON本身的语法合法性无关,仅和分类器的文件模式判定逻辑、数组展开触发条件相关。
隐含规则明细
- 规则1:分类器会优先判定文件类型,若文件中任意一行可单独解析为完整的合法JSON结构,会被判定为JSON Lines(行级JSON)模式;只有单个JSON结构跨多行存储时,才会被判定为普通多行JSON模式。
- 规则2:仅在普通多行JSON模式下,自定义JSONPath中的数组通配符
[*]才会触发数组展开逻辑,将数组内的每个元素映射为表的单独行;JSON Lines模式下仅支持提取每行JSON的节点作为记录字段,不支持数组平铺。 - 规则3:多行JSON模式下的数组展开对换行的要求分场景:匹配目标为顶层数组时,仅要求数组结构本身跨多行即可触发展开;匹配目标为嵌套在对象内的下层数组时,必须数组内的每个元素独立占一行,才会触发平铺。
测试现象对应解释
- 测试1:整行存储为单层数组结构,被判定为JSON Lines模式,
$[*]不触发展开,整行数组被识别为顶层array字段。 - 测试2:顶层数组跨多行存储,被判定为普通多行JSON,符合顶层数组展开要求,因此
$[*]生效。 - 测试3:嵌套的
resources数组本身跨多行,但数组内元素处于同一行,不符合嵌套数组的展开要求,因此$.resources[*]不生效。 - 测试4:经格式化后
resources数组的每个元素独立占一行,符合嵌套数组展开要求,因此路径生效。
可行解决方案
- 方案1:保留原有单行JSON Lines格式,无需调整分类器,在Glue ETL脚本中通过
explode函数手动展开数组提取字段,示例代码如下:
from pyspark.sql.functions import explode, col # 读取 catalog 表数据 source_df = glueContext.create_dynamic_frame.from_catalog( database="你的数据库名", table_name="你的表名" ).toDF() # 展开resources数组 exploded_df = source_df.select(explode(col("resources")).alias("resource_item")) # 提取所需字段生成目标表结构 target_df = exploded_df.select( col("resource_item.resourceType").alias("resourceType"), col("resource_item.id").alias("id") # 按需添加其他字段 )
- 方案2:调整JSON生成逻辑,将嵌套
resources数组内的每个元素单独换行存储,即可直接通过$.resources[*]分类器完成自动展开。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

