在Vertica的PARTITION BY中的Unix时间

时间:2014-07-16 16:48:55

标签: vertica

我在vertica中有一个大表,其中time_stamp(int)为unix时间戳。我想按周划分这个表(星期一开始工作日)。

有没有更好的方法一步完成,而不是将time_stamp从unix转换为TIMESTAMP(Vertica)然后再进行分区?

1 个答案:

答案 0 :(得分:4)

最理想的是,您应该使用日期/时间类型。您将无法在TO_TIMESTAMP表达式中使用PARTITION BY等非确定性函数。另一种方法是使用math来逻辑创建分区:

使用Unix时间戳进行分区:

              Divide By
Minutes       60
Hours         60 * 60 (3600)
Days          60 * 60 * 24 (86400)
Weeks         60 * 60 * 24 * 7 (604800)

如果我们使用604800,这将为您提供1970年1月1日00:00:00 UTC的周数。

让我们设置一个测试表:

CREATE TABLE public.test (
  time_stamp int NOT NULL
);

INSERT INTO public.test (time_stamp) VALUES (1404305559);
INSERT INTO public.test (time_stamp) VALUES (1404305633);
INSERT INTO public.test (time_stamp) VALUES (1404305705);
INSERT INTO public.test (time_stamp) VALUES (1404305740);
INSERT INTO public.test (time_stamp) VALUES (1404305778);

COMMIT;

让我们创建分区:

ALTER TABLE public.test PARTITION BY FLOOR(time_stamp/604800) REORGANIZE;

然后我们得到:

NOTICE 4954:  The new partitioning scheme will produce 1 partitions
WARNING 6100:  Using PARTITION expression that returns a Numeric value
HINT:  This PARTITION expression may cause too many data partitions.  Use of an expression that returns a more accurate value, such as a regular VARCHAR or INT, is encouraged
NOTICE 4785:  Started background repartition table task
ALTER TABLE

您还需要注意这会创建多少个分区。 Vertica recommends将分区数保持在10-20之间。