Загрузка данных с помощью разделов Hive, S3, EMR и Recover

решила: см. обновление #2 ниже для "решения" этой проблемы.

~~~~~~~

в s3 у меня есть журнал*.GZ файлы, хранящиеся во вложенной структуре каталогов, таких как:

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

Я пытаюсь загрузить их в Hive на Elastic Map Reduce( EMR), используя многоуровневую спецификацию раздела, такую как:

create external table logs (content string)
partitioned by (y string, m string, d string, h string)
location 's3://($BUCKET)';

Создание таблицы работ. Затем я пытаюсь восстановить все существующие разделы:

alter table logs recover partitions;

этот кажется, работает, и он детализирует мою структуру s3 и добавляет все различные уровни каталогов:

hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08
y=2012/m=11/d=06/h=09
y=2012/m=11/d=06/h=10
y=2012/m=11/d=06/h=11
y=2012/m=11/d=06/h=12
y=2012/m=11/d=06/h=13
y=2012/m=11/d=06/h=14
y=2012/m=11/d=06/h=15
y=2012/m=11/d=06/h=16
...

таким образом, кажется, что Hive может видеть и интерпретировать мой макет файла успешно. Однако фактические данные никогда не загружаются. Если я попытаюсь сделать простой подсчет или выбрать*, я ничего не получу:

hive> select count(*) from logs;
...
OK
0

hive> select * from logs limit 10;
OK

hive> select * from logs where y = '2012' and m = '11' and d = '06' and h='16' limit 10;
OK

мысли? Мне не хватает дополнительной команды для загрузки данных после восстановления разделов?

если я вручную добавлю раздел с явным местоположение, то это работает:

alter table logs2 add partition (y='2012', m='11', d='09', h='10') location 's3://($BUCKET)/y=2012/m=11/d=09/H=10/'

Я могу просто написать сценарий для этого, но кажется, что мне не хватает чего-то фундаментального.r.t "восстановление разделов".

обновление #1

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

файлы определенно организованы как следующая спецификация пути, с заглавной буквы H (я думаю, что это может быть некоторые кивают на форматирование iso8601):

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

Я создаю свою внешнюю таблицу со спецификацией раздела, которая делает правильную капитализацию:

partitioned by (y string, m string, d string, H string)

(обратите внимание на "H"). Я делаю разделы восстановления, которые, похоже, рекурсируют через каталоги и находят разделы соответствующим образом, но каким-то образом (несмотря на использование " H "во всех инструктивных местах до сих пор), действительно кажется, что Hive сохраняет его как нижний регистр "h":

hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08

(обратите внимание на "h"). Так кажется, что Улей способен обнаруживать разделы, но затем сохраняет их в строчной форме ... Позже, когда он идет искать данные, эти пути (конечно) пусты, потому что S3 чувствителен к регистру.

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

обновление #2

действительно, я подтвердил, что заглавная " H " как имя раздела (в макете файла s3) была проблемой здесь. Насколько я могу судить, вот что происходило:--12-->

  • мой макет на S3 имел имя раздела с учетом регистра (H=)
  • Запуск восстановления разделов правильно обнаруживает эти разделы...
  • но тогда они хранятся внутри в нижнем регистре (h)

команда "восстановить разделы" является расширением Hive, созданным Amazon. Я сильно подозреваю, что ошибка в этом компоненте. Насколько мне известно, native Hive не имеет понятия об изучении корня файла для обнаружения разделов...

1 ответов


Это вопрос Дела на поле час!