Как поступить с Афиной при изменении схемы новых данных?

У меня есть куча файлов ORC в S3, которые разбиты по датам. Данные помещаются в папки с их датами в S3. Однако недавно к созданным файлам ORC были добавлены новые столбцы.

Другими словами, более старые файлы ORC могут иметь ColumnA, ColumnB, ColumnC, тогда как более свежие файлы ORC (после определенной даты) имеют ColumnA, ColumnB, ColumnC, ColumnD, ColumnE.

Из-за этого данные, которые просматривает Athena, могут содержать ошибки, в которых сообщается, что тип ColumnD в ORC несовместим с типом в таблице Athena при запросе к нему.

  1. Могу ли я что-нибудь сделать в Glue или Athena, чтобы при сканировании он знал, что старые файлы ORC с отсутствующими ColumnD и ColumnE по умолчанию будут иметь значение null или любое другое значение, совместимое с типом, чтобы он не продолжал выдавать ошибку при запросе?
  2. Если (1) невозможно, что еще я могу сделать, чтобы Athena работала с набором данных, схема которого изменяется по ходу дела?

person Carven    schedule 20.11.2020    source источник


Ответы (1)


В целом Athena поддерживает эволюцию схемы, отличный обзор от AWS можно найти на Обработка обновлений схемы. Возможности во многом зависят от формата вашего файла. В вашем случае это ORC, поэтому Афина по умолчанию читает столбцы по индексу, поэтому важен их порядок:

  • вы не можете добавлять столбцы в начало или в середину таблицы
  • вы не можете удалить или изменить порядок столбцов
  • вы можете добавить столбцы в конец таблицы

Так что в вашем случае, когда вы просто хотите добавить два столбца в конец таблицы, проблем быть не должно, и вы сможете просто добавить эти столбцы с помощью _ 1_.

person Philipp Johannis    schedule 21.11.2020
comment
Как мне проверить, читала ли Афина мой ORC-файл по индексу или имени столбца? В моем случае, потому что в старых файлах ORC нет данных для двух новых столбцов. Только новые файлы ORC имеют новые столбцы. Фактически, новые столбцы уже добавлены в схему при сканировании файлов. Но просто добавить новые столбцы в схему не получится. - person Carven; 22.11.2020
comment
Это часть SERDEPROPERTIES - не могли бы вы запустить SHOW CREATE TABLE table_name? Должно появиться orc.column.index.access'='true' - person Philipp Johannis; 22.11.2020
comment
Я только что это сделал, и в результатах нет orc.column.index.access'='true'. Самое близкое - это что-то ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'. Означает ли это, что используется имя столбца, указанное в индексе? - person Carven; 22.11.2020
comment
Не могли бы вы добавить полное выражение CREATE TABLE к своему вопросу - тогда так будет легче поддержать. - person Philipp Johannis; 22.11.2020