用于提取 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
)
我在 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
)