配置单元-按数据内容对外部表进行分区

mznpcxlj  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(336)

我在hdfs中的表单目录下有一堆gzip文件 /home/myuser/salesdata/some_date/ALL/<country>.gz 例如 /home/myuser/salesdata/20180925/ALL/us.gz 数据的格式如下

<country> \t count1,count2,count3

所以本质上,它首先是制表符分隔的,然后我需要将逗号分隔的值提取到单独的列中
我想创建一个外部表,按国家、年、月和日对此进行分区。数据的大小非常大,可能有100 tb,因此我希望有一个外部表本身,而不是必须通过将数据导入标准表来复制数据。
是否可以仅使用外部表来实现这一点?

jjhzyzn0

jjhzyzn01#

考虑到你的国家被 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

我把这个国家看作是动态的分区,因为它来自文件,而其他国家则不是,所以它是静态的。

相关问题