更改配置单元表的分区规范并移动数据

时间:2019-05-18 04:43:32

标签: hive hiveql

我有一个外部配置单元表员工,该员工单元按以下所示的extract_timestamp(yyyy-mm-dd hh:mm:ss)进行分区。

empid   empname     extract_time
1       abc         2019-05-17 00:00:00
2       def         2019-05-18 14:21:00

我正在尝试通过extract_time删除分区并将其更改为年,月和日分区。我正在按照以下方法进行操作。

1。创建一个新表employee_new,其分区年份为年月日

 create external table employee_new
(empid int,
 empname string
)
partitioned by (year int,month int,day int)
location '/user/emp/data/employee_new.txt';

2。通过从员工表中选择数据,将覆盖内容插入到employee_new中

insert overwrite into employee_new as select*,year(extract_time),month(extract_time)
,day(extract_time) 
from employee

3。放下employee和employee_new并在/user/emp/data/employee_new.txt

顶部创建employee表

请让我知道此方法是否有效,是否有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:0)

如果可能,如果上游进程可以将小时文件写入每日文件夹,则仅按date yyyy-MM-dd进行分区。对于这么小的表,按年,月和日分别进行分区似乎过大了。仍然会有太多文件夹。 如果表按日期yyyy-MM-dd进行分区,则分区修剪将适用于您的使用情况,因为您按天,年或月进行查询。

在这种情况下,按年份进行过滤,您将提供

where date >= '2019-01-01' and date < '2020-01-01'条件,

按月份过滤:

where date >= '2019-01-01' and date < '2020-02-01'

和日期:where date = '2019-01-01'

文件系统列表将运行得更快。

如果无法重新设计上游流程以写入yyyy-MM-dd文件夹,则您在问题中描述的新设计(yyyy / MM / dd文件夹)是唯一的解决方案。