Hive - разбить внешнюю таблицу по содержанию данных - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть несколько сжатых файлов в HDFS в каталогах вида /home/myuser/salesdata/some_date/ALL/<country>.gz, например /home/myuser/salesdata/20180925/ALL/us.gz

Данные имеют вид

<country> \t count1,count2,count3

Так что по сути этопервая вкладка разделена, а затем мне нужно извлечь значения, разделенные запятыми, в отдельные столбцы

Я хотел бы создать внешнюю таблицу, разделив ее по странам, годам, месяцам и дням.Размер данных довольно большой, потенциально 100 ТБ, поэтому я бы хотел иметь внешнюю таблицу, а не дублировать данные, импортируя их в стандартную таблицу.

Можно ли этого добиться, используя только внешнюю таблицу?

1 Ответ

0 голосов
/ 25 сентября 2018

, учитывая, что ваша страна отделена tab '\t', а другие поля разделены ,. Это то, что вы можете сделать.

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

create external table temp.test_csv (country string, count array<int>)
row format delimited
fields terminated by "\t"
collection items terminated by ',' 
stored as textfile
location '/apps/temp/table';

Теперь, если вы поместите свои файлы в папку /apps/temp/table, вы сможете выбрать данные, как указано ниже.

select country, count[0] as count_1, count[1] count_2, count[2] count_3 from temp.test_csv

Теперь для создания разделов создайте еще одну таблицу, как упомянуто ниже.

drop table temp.test_csv_orc;
create table temp.test_csv_orc ( count_1 int, count_2 int, count_3 int) 
partitioned by(year string, month string, day string, country string) 
stored as orc; 

И загрузите данные из временной таблицы в эту.

insert into temp.test_csv_orc partition(year="2018", month="09", day="28", country) 
select count[0] as count_1, count[1] count_2, count[2] count_3, country from temp.test_csv

Я выбрал страну как Динамическое разделение, так как оно исходит из файла, но другие не так статичны.

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