代码之家  ›  专栏  ›  技术社区  ›  user6344468

在读取拼花文件时,Amazon Athena无法在数组中正确保留struct的属性名称

  •  1
  • user6344468  · 技术社区  · 7 年前

    |-- arrival_pages: array
    |    |-- element: struct
    |    |    |-- hierarchy: long
    |    |    |-- id: long
    |    |    |-- recency: long
    (partial output from pyspark's dataframe.printSchema)
    

    为了读取属性,我在雅典娜中定义了一个具有这种类型的列:

    arrival_pages array<struct<id: bigint, hierarchy: bigint, recency: bigint>>
    

    任何涉及此列的select查询都会成功执行,但生成的结构不会保留其属性名称对应关系。也就是说,属性名称从拼花映射到雅典娜,如下所示:

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

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

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

    执行查询 成功地 生成的映射如下所示:

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

    因此,雅典娜似乎只是按照预定义的顺序读取struct的属性,并将它们映射到所需的结构中,而不管它有什么属性名称。这是故意的还是我遗漏了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user6344468 user6344468    7 年前

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

    幸运的是,我能够很容易地修改拼花文件的结构,所以我将使其更平坦,这样我就可以避免在雅典娜中使用结构类型。