Таблицы отсутствуют в файловой системе в AWS Athena

Я создал таблицу с автоматическим разбиением с помощью этого кода на Афине.

CREATE EXTERNAL TABLE IF NOT EXISTS matchdata.stattable (
  `matchResult` string,
  ...
) PARTITIONED BY (
  year int ,
  month int,
  day int
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
) LOCATION 's3://******/data/year=2019/month=8/day=2/'
TBLPROPERTIES ('has_encrypted_data'='false');

и я запустил статтаблицу MSCK REPAIR TABLE, но в файловой системе отсутствуют таблицы, а результат запроса - возвращено нулевых записей. matchdata.stattable получает тот же результат.

Другая таблица без секционирования, запрос работает нормально. Но по мере того, как обслуживание продолжается, и набор данных растет, я должен перейти к секционированию.

Пример пути к данным: data / 2019/8/2 / 1SxFHaUeHfesLtPs._BjDk.gz. Как я могу решить эту проблему?


person Leta    schedule 07.08.2019    source источник
comment
Я снова создал таблицу с местоположением s3: // *** / data /, но затем у меня было Разделы не в хранилище метаданных. Я добавил раздел вручную и попытался снова, но автоматическое разделение с помощью восстановления msck не работает.   -  person Leta    schedule 07.08.2019


Ответы (2)


Как вы обнаружили (но с дополнительным контекстом для людей, имеющих ту же проблему) MSCK REPAIR TABLE … понимает только разбиение в стиле Hive, например /data/year=2019/month=08/day=10/file.json. На самом деле команда просматривает префикс на S3, соответствующий директиве LOCATION таблицы, и ищет компоненты пути, которые выглядят так.

Это просто ограничение для MSCK REPAIR TABLE …, вы можете вручную добавлять разделы с другими стилями пути, например:

ALTER TABLE the_table ADD PARTITION (year = '2019', month = '08', day = '10') LOCATION 's3://some-bucket/data/2019/08/10/'

См. Также https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.html

Я бы даже сказал, что вам следует вообще избегать использования MSCK REPAIR TABLE …. Это медленно, и чем больше разделов у вас есть, тем медленнее становится. Гораздо эффективнее запускать ALTER TABLE … ADD PARTITION …, когда вы добавляете новые данные на S3, потому что вы знаете, что вы только что добавили и где это, поэтому указывать Афине сканировать весь ваш префикс не нужно. Еще быстрее можно использовать напрямую Glue API, но, к сожалению, это больше кода.

person Theo    schedule 10.08.2019

Я решил эту проблему переименованием префикса файлов s3.

Вы не можете напрямую переименовать или переместить файл в s3. С помощью команды mv вы должны создать еще один ключ и удалить существующий.

Запустив этот код на консоли, вы можете заставить Hive понять расположение раздела.

aws s3 --recursive mv s3://***/data/2019/8/7/ s3://***/data/year=2019/month=8/day=7/
person Leta    schedule 07.08.2019