读取镶木地板文件时,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 中使用结构类型。