AWS Athena: использовать имя папки в качестве раздела

У меня есть тысячи отдельных файлов json (соответствующих одной строке таблицы), хранящихся в s3 по следующему пути: s3://my-bucket/<date>/dataXX.json

Когда я создаю свою таблицу в DDL, возможно ли, чтобы данные были разделены присутствующим в пути S3? (или хотя бы добавить значение в новый столбец)

Спасибо


person Raphael    schedule 01.03.2017    source источник


Ответы (4)


К сожалению, это не поддерживается в Афине. Для разбиения на разделы для работы с папками существуют требования к тому, как папка должна называться.

например s3: // my-bucket / {columnname} = {columnvalue} /data.json

В вашем случае вы все равно можете использовать разбиение, если добавите эти разделы в таблицу вручную.

например ALTER TABLE имя таблицы ДОБАВИТЬ РАЗДЕЛ (datecolumn = '2017-01-01') location 's3: // my-bucket / 2017-01-01 /

В документации AWS есть несколько хороших примеров по этой теме.

AWS Athena Partitioning

person jens walter    schedule 01.03.2017
comment
У меня такая же потребность, поэтому для каждого нового запроса я должен ALTER TABLE давать значения столбцам раздела ?! - person Hayat Bellafkih; 29.06.2018
comment
Это неправда, вариант использования покрывается проекцией раздела, см. Ответ Джереми Джако ниже. - person Nicolas Busca; 16.06.2021

Теперь это можно сделать с помощью storage.location.template. Это разделит часть вашего пути. Обязательно НЕ включайте новый столбец в список столбцов, так как он будет добавлен автоматически. Есть много вариантов, которые вы можете найти, чтобы настроить это для своего примера даты. Я использовал id, чтобы показать самую простую версию, которую я мог придумать.

CREATE EXTERNAL TABLE `some_table`(
  `col1` bigint, 
PARTITIONED BY (
  `id` string
  )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://path/bucket/'
TBLPROPERTIES (
  'has_encrypted_data'='false',
  'projection.enabled'='true', 
  'projection.id.type' = 'injected',
  'storage.location.template'='s3://path/bucket/${id}/'
  )

официальные документы: https://docs.amazonaws.cn/en_us/athena/latest/ug/partition-projection-dynamic-id-partitioning.html

person Jeremy Giaco    schedule 15.06.2021

Нет необходимости делать это вручную. Настройте склеивающий сканер, и он подберет папку (в префиксе) как раздел, если все папки в пути имеют одинаковую структуру и все данные имеют одинаковую структуру схемы.

Поместите его наименование раздела как partition0. Вы можете войти в схему редактирования и изменить имя этого раздела на текущее время или как хотите.

Но убедитесь, что вы зашли в свой поисковый робот и в разделе «Параметры конфигурации» выберите вариант «Добавить только новые столбцы». В противном случае при следующем запуске glue-crawler он сбросит имя раздела обратно на partition0.

person Venkat.V.S    schedule 09.11.2018

Вам нужно назвать каждую папку S3 как это изображение:

image

После настройки Athena укажите dt для раздела:

image

После этого запустите MSCK REPAIR TABLE <your table name>; на Афине.

person Itaru Kishikawa    schedule 16.04.2020