忽略对象键;仅添加 JSON 正文?

Ignore object keys; only add JSON body?

我的数据结构如下:

key_1: {id: key_1, name: name_1, other_data: data_1}
key_2: {id: key_2, name: name_2, other_data: data_2}
key_3: {id: key_3, name: name_3, other_data: data_3}

理想情况下,我希望 Glue table 架构看起来像这样:

id:string
name:string
other_data:string

但是 Glue 创建的模式是:

key_1:
  id:string
  name:string
  other_data:string
key_2:
  id:string
  name:string
  other_data:string
key_3:
  id:string
  name:string
  other_data:string

有没有办法让 Glue 忽略外键,而只在正文内容上开发一个模式,而不必更改底层 S3 文件本身?

胶水配置:

不,没有使用 Glue 配置。 Glue Crawlers 不是很聪明,通常只能解决最基本的任务 - 但在这种情况下,限制在 Athena 中。你不能告诉 table 解压这样的结构。

在您的示例中,行具有不同的键(key_1、key_2、key_3)这些行之间真的不同,还是实际上每个行上的键相同排?由于您对 id 属性 使用相同的字符串,我假设它们以某种方式连接?

如果它们不同,我认为你或多或少完全不走运,每一行都会让 Glue Crawler 创建一个不同的列,你最终可能会在极限附近的某个地方得到一组任意的列允许的列数 - 以及列集会根据抓取工具在特定日期看到行的顺序而变化。不幸的是,这永远不会与 Glue 或 Athena 一起使用。

但是,如果每行的外键相同(比方说“outer_key”),您可以创建一个视图来为您解包,这样您的查询就不会至:

CREATE VIEW unpacked_rows AS
SELECT outer_key.id, outer_key.name, outer_key.other_key
FROM my_table

然后您可以像查询任何视图一样查询该视图 table,并获得您想要的结果:

SELECT * FROM unpacked_rows
id    | name   | other_key
------+--------+----------
key_1 | name_1 | data_1
key_2 | name_2 | data_2
key_3 | name_3 | data_3