Hive: создание таблиц с несколькими файлами с несколькими каталогами - PullRequest
13 голосов
/ 28 января 2012

Я хочу создать таблицу Hive, в которой входные текстовые файлы перемещаются по нескольким подкаталогам в формате hdf. Итак, у меня есть пример в hdfs:

    /testdata/user/Jan/part-0001
    /testdata/user/Feb/part-0001
    /testdata/user/Mar/part-0001
and so on...

Если я хочу создать пользователя таблицы в улье, но может ли он пройти через подкаталоги пользователя, можно ли это сделать? Я пробовал что-то вроде этого, но не работает;

CREATE EXTERNAL TABLE users (id int, name string) 
STORED AS TEXTFILE LOCATION '/testdata/user/*'  

Я думал, что добавление подстановочного знака будет работать, но это не так. Когда я пытался не использовать подстановочный знак по-прежнему не работает. Однако, если я скопирую файлы в корневой каталог пользователя, то это сработает. У Hive нет никакого способа перейти к дочерним каталогам и получить эти файлы?

Ответы [ 4 ]

23 голосов
/ 28 сентября 2012

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

CREATE EXTERNAL TABLE test (id BIGINT) PARTITIONED BY ( yymmdd STRING);
ALTER TABLE test ADD PARTITION (yymmdd = '20120921') LOCATION 'loc1';
ALTER TABLE test ADD PARTITION (yymmdd = '20120922') LOCATION 'loc2';
7 голосов
/ 14 февраля 2014

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

#!/bin/bash
hive -e "CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) STORED AS TEXTFILE LOCATION '/testdata/user/'; "

hscript=""

for part in `hadoop fs -ls /testdata/user/ | grep -v -P "^Found"|grep -o -P "[a-zA-Z]{3}$"`;
do

echo $part
tmp="ALTER TABLE users ADD PARTITION(month='$part');"
hscript=$hscript$tmp
done;

hive -e "$hscript"
5 голосов
/ 29 января 2012

Hive использует подкаталоги в качестве разделов данных, поэтому просто:

CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string)
STORED AS TEXTFILE LOCATION '/testdata/user/'  

Это должно сделать это для вас.

0 голосов
/ 31 января 2012
CREATE EXTERNAL TABLE user (id int, name string);
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...