1

我有一个外部配置单元表员工,它由 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 表

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

4

1 回答 1

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 文件夹)是唯一的解决方案。

于 2019-05-18T20:17:45.210 回答