如何合并配置单元中现有分区的小文件?

时间:2017-02-07 13:27:51

标签: sql hadoop hive hiveql hadoop-partitioning

如何将现有的分区小文件合并到一个分区中的一个大文件中。

例如我有一个表user1,它包含列fname,lname和partition列是day。

我使用下面的脚本

创建了表格

CREATE TABLE user1(fname string,lname string)parittioned By(day int);

将数据插入分区表后,它将如下所示。

 fname  lname  day
.....................
AA      AAA   20170201     ....>partition 20170201
BB      BBB   20170201
...................
CC      CCC   20170202    ......>partition 20170202
DD      DDD   20170202
....................
EE      EEE   20170203    .......>partition 20170203
FF      FFF   20170203
.......................
GG      GGG   20170204    ........>partition 20170204         
HH      HHH   20170204
.......................

当我在分区列的帮助下执行select查询,即day = 20170201。

select * from user1 where day=20170201;

它会给出如下结果

AA      AAA   20170201
BB      BBB   20170201

基于上表我想在我的分区表(即USer1)中将所有小文件,即day = 20170201和day = 20170202以及day = 20170203合并到分区day = 20170203中.i.e。它应该如下所示。

fname  lname  day
.....................
AA      AAA   20170201
BB      BBB   20170201
CC      CCC   20170202    
DD      DDD   20170202
E       EEE   20170203    .......>partition 20170203
FF      FFF   20170203
.......................
GG      GGG   20170204    ........>partition 20170204         
HH      HHH   20170204
.......................

你能否就此提出建议,我该如何做到这一点?

先谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 创建按新字段partition_day分区的新表:
  2. CREATE TABLE user_new(fname string,lname string, day int) parittioned By (partition_day int);
    
    1. 将数据加载到新表中(在case
    2. 中定义新分区的条件
         insert overwrite table user_new partition (partition_day)
          select fname,lname, day,
                 case when day <= 20170203 then 20170203
                      when day >  20170203 then 20170204
                 end as partition_day
            from user1 ;