【问题标题】:How to handle Athena when there are schema changes in new data?当新数据中存在架构更改时如何处理 Athena?
【发布时间】:2021-03-04 06:40:27
【问题描述】:

我在 S3 中有一堆按日期划分的 ORC 文件。数据放置在 S3 中其日期的文件夹中。但是,最近在创建的 ORC 文件中添加了新列。

换句话说,较旧的 ORC 文件可能具有 ColumnA, ColumnB, ColumnC,而较新的 ORC 文件(在某个日期之后)具有 ColumnA, ColumnB, ColumnC, ColumnD, ColumnE

因此,Athena 爬取的数据在查询时可能会出现错误,抱怨 ORC 中的ColumnD 类型与 Athena 表中的类型不兼容。

  1. 我可以在 Glue 或 Athena 中做些什么,以便在爬网时知道缺少 ColumnDColumnE 的旧 ORC 文件将默认为 null 或与该类型兼容的任何值,以便查询时不会一直报错?
  2. 如果 (1) 不可行,我还能做些什么来让 Athena 处理在其架构中发生变化的一组数据?

【问题讨论】:

    标签: amazon-web-services amazon-s3 etl amazon-athena orc


    【解决方案1】:

    一般而言,Athena 支持架构演变,AWS 在Handling Schema Updates 上有一个很好的概述。可能的情况在很大程度上取决于您的文件格式。在您的情况下,它是 ORC,因此 Athena 默认按索引读取列,因此它们的顺序很重要:

    • 不能在表格的开头或中间添加列
    • 不能删除或重新排列列
    • 可以在表格末尾添加列

    因此,在您的情况下,您只想在表格末尾添加两列应该没有任何问题,您应该能够使用 ALTER TABLE ADD COLUMN 简单地添加这些列。

    【讨论】:

    • 如何检查 Athena 是否按索引或列名读取我的 ORC 文件?就我而言,因为旧的 ORC 文件没有 2 个新列的数据。只有新的 ORC 文件具有新列。实际上,在抓取文件时,新列已经添加到架构中。但是仅仅将新列添加到架构中是行不通的。
    • 它是 SERDEPROPERTIES 的一部分 - 你能运行 SHOW CREATE TABLE table_name 吗?它应该显示orc.column.index.access'='true'
    • 我刚刚这样做了,结果中根本没有orc.column.index.access'='true'。最接近的是ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'。这是否意味着它使用的是索引的列名?
    • 您能否将完整的 CREATE TABLE 声明添加到您的问题中 - 这样更容易支持。
    猜你喜欢
    • 2011-08-11
    • 2021-02-05
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多