在读取镶木地板文件时,Amazon Athena不会在数组中正确保留struct的属性名称

时间:2017-10-31 10:00:29

标签: parquet amazon-athena

我正在尝试阅读包含从Amazon Athena输入为struct数组的属性的镶木地板文件。这个属性实际上是这样的:

|-- 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>>

涉及此列的任何选择查询都会成功执行,但结果struct不会保留其属性名称对应关系。也就是说,属性名称从镶木地板映射到雅典娜,如下所示:

(parquet -> Athena)
hierarchy -> id
id -> hierarchy
recency -> recency

当我在Athena的表定义中设置随机属性名称时,例如:

arrival_pages array<struct<foo: bigint, bar: bigint, baz: bigint>>

查询执行成功,结果映射如下所示:

(parquet -> Athena)
hierarchy -> foo
id -> bar
recency -> baz

因此,似乎Athena只是按预定义的顺序读取struct的属性,并将它们映射到所需的结构,而不管它具有什么属性名称。这是预期的行为还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

这个问题是因为a bug in older version of Hive,Athena使用它来管理其元数据。此错误已在最新版本的Hive中修复,但Athena仍在使用旧版本。目前还没有关于升级的公告。

Fortunatelly我能够轻松修改镶木地板文件的结构,所以我会让它变得更平坦,这样我就可以避免在Athena中使用struct类型了。