Преобразование структуры папок в разделы на S3 с помощью Spark

У меня много данных на S3, которые находятся в папке, а не в разделах. Структура выглядит так:

## s3://bucket/countryname/year/weeknumber/a.csv

s3://Countries/Canada/2019/20/part-1.csv
s3://Countries/Canada/2019/20/part-2.csv
s3://Countries/Canada/2019/20/part-3.csv

s3://Countries/Canada/2019/21/part-1.csv
s3://Countries/Canada/2019/21/part-2.csv

Есть ли способ преобразовать эти данные как паритетоны. Что-то вроде этого:

s3://Countries/Country=Canada/Year=2019/Week=20/part-1.csv
s3://Countries/Country=Canada/Year=2019/Week=20/part-2.csv
s3://Countries/Country=Canada/Year=2019/Week=20/part-3.csv

s3://Countries/Country=Canada/Year=2019/Week=21/part-1.csv
s3://Countries/Country=Canada/Year=2019/Week=21/part-2.csv

Я понятия не имею, как это сделать, вместо того, чтобы иметь цикл for, который выполняет итерацию по всем папкам и загружает данные, что является сложным.

Любая помощь будет оценена по достоинству.


person Waqar Ahmed    schedule 31.07.2019    source источник
comment
Проверь это. stackoverflow.com/questions/16897778/   -  person Lamanus    schedule 31.07.2019
comment
Мои данные не разделены.   -  person Waqar Ahmed    schedule 31.07.2019
comment
Ваши данные вручную разбиты на разделы с номером недели, и вам просто нужно установить его в качестве раздела.   -  person Lamanus    schedule 31.07.2019
comment
и как я могу это сделать?   -  person Waqar Ahmed    schedule 31.07.2019
comment
запустив краулер по странам, он создаст разделы, partition_0, partition_1, partition_2. Вы можете переименовать их либо через консоль Glue, либо через код glue pyspark.   -  person Sandeep Fatangare    schedule 13.08.2019


Ответы (1)


Пути в стиле Hive не всегда необходимы для разделения. Я получил этот вопрос из другого вопроса, который вы написали в контексте Athena, поэтому я собираюсь предположить, что базовое хранилище метаданных на самом деле является Glue, и что вы действительно нацеливаетесь на Athena (я добавил тег amazon-athena к вашему вопросу) .

В Presto или Athena / Glue вы можете добавлять разделы для любого пути, если префиксы не перекрываются. Например, чтобы добавить разделы в первом примере, вы должны сделать это:

ALTER TABLE table_name ADD IF NOT EXISTS
  PARTITION (country = 'Canada', year_week = '2019-20') LOCATION 's3://Countries/Canada/2019/20/'
  PARTITION (country = 'Canada', year_week = '2019-21') LOCATION 's3://Countries/Canada/2019/21/'

Предполагается, что существует year_week столбец, но вы можете иметь year и week как отдельные столбцы, если хотите (и делаете (country = 'Canada', year = '2019', week = '20')), либо работает.


Почему почти все примеры Athena используют пути в стиле Hive (например, country=Canada/year=2019/week=20/part-1.csv)? Частично это связано с историческими причинами, IIRC Hive не поддерживает никаких других схем, разделение и пути тесно связаны. Другая причина заключается в том, что команда Athena / Presto MSCK REPAIR TABLE работает только с этим стилем разделения (но вы хотите, чтобы в любом случае не полагайтесь на эту команду). Существуют также другие инструменты, которые предполагают или работают с этим стилем и никаким другим. Если вы их не используете, это не имеет значения.


Если вам абсолютно необходимо использовать разделение в стиле Hive, существует функция, позволяющая создавать «символические ссылки» на файлы в отдельной структуре путей. Вы можете найти инструкции, как это сделать, здесь: https://stackoverflow.com/a/55069330/1109 - но имейте в виду, что это означает, что вам придется поддерживать эту другую структуру пути в актуальном состоянии. Если вам не нужно использовать пути в стиле Hive для ваших разделов, я бы посоветовал вам не беспокоиться о дополнительной сложности.

person Theo    schedule 01.08.2019
comment
Еще раз спасибо за ответ. Просто быстрый вопрос, не будет ли сложно сгенерировать этот запрос для всех стран, месяцев и дней? Думаю, мне нужно использовать boto или другую библиотеку для чтения ключей и генерации запроса с их помощью. Я прав? - person Waqar Ahmed; 01.08.2019
comment
Обычно я пишу сценарий, который сканирует S3 (или использую S3 Inventory для получения списка) и генерирует ALTER TABLE SQL. Вы можете использовать _2 _ и параметры Delimiter и Prefix для рекурсивного перечисления структуры, но избегайте перечисления каждого отдельного объекта (на самом деле это то, что делает Athena, когда вы запрашиваете неразмеченную таблицу). - person Theo; 01.08.2019
comment
Большой! Спасибо за подсказку. Я попробую, и если больше не будет вопросов. Я приму это :) - person Waqar Ahmed; 01.08.2019