用于提取 JSON 数组值的 AWS Glue 分类器

AWS Glue classifier for extracting JSON array values

我在 S3 中有每行结构内联 JSON 的文件:

{ "resources": [{"resourceType":"A","id":"A",...},{...}] }

如果我 运行 粘在上面,我会得到“resource: array”作为顶级元素。但是,我希望检查数组的元素并将其用作顶级 table 元素。每个 resources 数组的所有元素都将具有相同的架构。所以我期待

resourceType: string
id: string
....

理论上,自定义 JSON 分类器应该处理这个问题:

$.resources[*]

但是,路径没有被拾取。所以我仍然将 resources:array 作为顶级元素。

我现在可以 运行 一些预处理来自己提取数组元素并逐行写入。但是,我想了解为什么我的路径不起作用。

更新 1:

这可能与我不理解的 JSON 有关(它的有效 JSON 由 JAVA Jackson 生成)。如果我删除具有 resources 属性的外部对象并将结构更改为

[{"resourceType":"A","id":"A",...},{...}]

分类器$[*] 应该拾取子对象。但我仍然得到 array:array 作为顶级元素。

更新 2:

确实是格式问题。如果我将 JSON 文件更改为

[
  {"resourceType":"A","id":"A",...},{...}
]

$[*] 开始工作。

更新 3:

但是不是修复$.resources[*]的问题以重新格式化为

{
    "resources": [
        {"resourceType":"A","id":"A",...},{...}
    ]
}

更新 4:

如果我通过 Intellij 重新格式化我的文件并 运行 它,因此生成一个 JSON 对象,其中所有嵌套元素都有换行符,它也开始使用 $.resources[*].基本上,就像在 UPDATE 3 中一样,只是向下应用了结构。

{
    "resources": [
        {
          "resourceType":"A",
          "id":"A"
        },
        {
          ...
        }
    ]
}

令我困扰的是,关于结构的要求对我来说仍然不清楚,因为更新 2 有效,但更新 3 无效。我在文档中也找不到关于 JSON 的正式要求结构。

从这个意义上说,我想我已经得出了我自己的问题的结论,但系统学仍然有点不清楚。

到此结束:

此问题与记录不明确的 JSON Glue 格式要求有关。

通过 json.dumps(my_json, separators=(',',':')) 的规范化生成适用于我的用例的紧凑 JSON。

我现在通过 lambda 规范化了内容。

Lambda 代码作为可能帮助的人的参考:

    s3 = boto3.client('s3')

    paginator = s3.get_paginator('list_objects_v2')

    pages = paginator.paginate(Bucket=my_bucket)
    
    for page in pages:
        try:
            contents = page["Contents"]
        except KeyError:
            break

        for obj in contents:
            key = obj["Key"]
            obj = s3.get_object(Bucket=my_bucket, Key=key)
            j = json.loads(obj['Body'].read().decode('utf-8'))
            
            new_json = json.dumps(j, separators=(',',':'))
                
            target = 'nrmlzd/' + key
                
            s3.put_object(
                Body=new_json,
                Bucket=my_bucket,
                Key= target
            )