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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 16:18:03