读取镶木地板文件时,Amazon Athena 未在数组中正确保留 属性 个结构名称
Amazon Athena does not preserve property names of struct correctly in an array when reading parquet files
我正在尝试从 Amazon Athena 读取包含 属性 类型为结构数组的镶木地板文件。这个 属性 实际上是这样的:
|-- arrival_pages: array
| |-- element: struct
| | |-- hierarchy: long
| | |-- id: long
| | |-- recency: long
(partial output from pyspark's dataframe.printSchema)
为了阅读 属性,我在 Athena 中定义了一个具有这种类型的列:
arrival_pages array<struct<id: bigint, hierarchy: bigint, recency: bigint>>
涉及此列的任何 select 查询都会成功执行,但生成的结构不会保留其 属性 名称对应关系。也就是说,属性 名称从 parquet 映射到 Athena,如下所示:
(parquet -> Athena)
hierarchy -> id
id -> hierarchy
recency -> recency
当我在 Athena 上的 table 定义中设置随机 属性 名称时,例如:
arrival_pages array<struct<foo: bigint, bar: bigint, baz: bigint>>
查询执行成功,生成的映射如下所示:
(parquet -> Athena)
hierarchy -> foo
id -> bar
recency -> baz
因此,Athena 似乎只是按预定义的顺序读取结构的属性,并将它们映射到所需的结构中,而不管它具有什么 属性 名称。这是预期的行为还是我遗漏了什么?
这个问题是因为 a bug in older version of Hive,Athena 使用它来管理其元数据。这个bug在最新版本的Hive中已经修复,但是Athena还在使用旧版本。并且暂时没有升级的公告
幸运的是,我能够轻松修改 parquet 文件的结构,所以我打算让它更平坦,这样我就可以避免在 Athena 中使用结构类型。
我正在尝试从 Amazon Athena 读取包含 属性 类型为结构数组的镶木地板文件。这个 属性 实际上是这样的:
|-- arrival_pages: array
| |-- element: struct
| | |-- hierarchy: long
| | |-- id: long
| | |-- recency: long
(partial output from pyspark's dataframe.printSchema)
为了阅读 属性,我在 Athena 中定义了一个具有这种类型的列:
arrival_pages array<struct<id: bigint, hierarchy: bigint, recency: bigint>>
涉及此列的任何 select 查询都会成功执行,但生成的结构不会保留其 属性 名称对应关系。也就是说,属性 名称从 parquet 映射到 Athena,如下所示:
(parquet -> Athena)
hierarchy -> id
id -> hierarchy
recency -> recency
当我在 Athena 上的 table 定义中设置随机 属性 名称时,例如:
arrival_pages array<struct<foo: bigint, bar: bigint, baz: bigint>>
查询执行成功,生成的映射如下所示:
(parquet -> Athena)
hierarchy -> foo
id -> bar
recency -> baz
因此,Athena 似乎只是按预定义的顺序读取结构的属性,并将它们映射到所需的结构中,而不管它具有什么 属性 名称。这是预期的行为还是我遗漏了什么?
这个问题是因为 a bug in older version of Hive,Athena 使用它来管理其元数据。这个bug在最新版本的Hive中已经修复,但是Athena还在使用旧版本。并且暂时没有升级的公告
幸运的是,我能够轻松修改 parquet 文件的结构,所以我打算让它更平坦,这样我就可以避免在 Athena 中使用结构类型。