2013-08-07 2 views
4

Предоставлена ​​многораздельная структура фс, как следующее:Создания Impala внешней таблицы из секционированной структуры файла

logs 
└── log_type 
    └── 2013 
     ├── 07 
     │   ├── 28 
     │   │   ├── host1 
     │   │   │   └── log_file_1.csv 
     │   │   └── host2 
     │   │    ├── log_file_1.csv 
     │   │    └── log_file_2.csv 
     │   └── 29 
     │    ├── host1 
     │    │   └── log_file_1.csv 
     │    └── host2 
     │     └── log_file_1.csv 
     └── 08 

Я пытался создать внешнюю таблицу в Impala:

create external table log_type (
    field1 string, 
    field2 string, 
    ... 
) 
row format delimited fields terminated by '|' location '/logs/log_type/2013/08'; 

Я хочу Импала рекурсировала в поддиректории и загрузила все файлы csv; но нет сигары. Ошибок не возникает, но данные не загружаются в таблицу.

Различные глыбы, такие как /logs/log_type/2013/08/*/* или /logs/log_type/2013/08/*/*/* тоже не работают.

Есть ли способ сделать это? Или мне нужно реструктурировать fs - любой совет по этому поводу?

ответ

9

в случае, если вы все еще ищете ответ. Вам необходимо зарегистрировать каждый отдельный раздел вручную.

Смотрите здесь для подробностей Registering External Table

Ваша схема для таблицы должна быть скорректирована

create external table log_type (
     field1 string, 
     field2 string, 
...) 
    partitioned by (year int, month int, day int, host string) 
    row format delimited fields terminated by '|'; 

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

Что-то вроде этого

ALTER TABLE log_type ADD PARTITION (year=2013, month=07, day=28, host="host1") 
    LOCATION '/logs/log_type/2013/07/28/host1'; 

После этого вам необходимо обновить таблицу в импала.

invalidate log_type; 
refresh log_type; 
0

Другой способ сделать это было бы использовать функцию LOAD DATA в Impala. Если данные в SequenceFile или других менее Impala-дружественном формате (Impala file formats), вы можете создать свой внешний стол, как Джо делает выше, но вместо ALTER TABLE, вы можете сделать что-то вроде

LOAD DATA INPATH '/logs/log_type/2013/07/28/host1/log_file_1.csv' INTO TABLE log_type PARTITION (year=2013, month=07, day=28, host=host1); 
Смежные вопросы