Подтвердить что ты не робот

Hive: создание таблицы с несколькими файлами с несколькими каталогами

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

    /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 мог перейти к дочерним каталогам и захватить эти файлы?

4b9b3361

Ответ 1

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

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';

Ответ 2

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

#!/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"

Ответ 3

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

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

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

Ответ 4

CREATE EXTERNAL TABLE user (id int, name string);
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users;

Ответ 5

Не ставьте * после /testdata/user/, потому что путь к файлу будет автоматически принимать все подкаталоги.

Если вы хотите создать разделы, создайте папку HDFS, например /testdata/user/year = dynamicicyear/month = dynamicmonth/date = dynamicdate

После создания таблицы с разделом используйте таблицу имен msck repair table.

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