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

4xrmg8kj  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(372)

我有一个外部配置单元表employee,它由extract\u 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

我正在尝试按提取时间删除分区,并将其更改为年、月和日分区。我遵循下面的方法。
1.创建一个新表employee\u 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表中选择数据,将覆盖插入employee\u new

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

3.删除employee和employee\u new,并在/user/emp/data/employee\u new.txt上创建employee表
请让我知道,如果这个方法是有效的,如果有任何更好的方法做同样的。

cngwdvgl

cngwdvgl1#

分区依据 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文件夹)中描述的新设计是唯一的解决方案。

相关问题