我在vertica中有一个大表,其中time_stamp(int)为unix时间戳。我想按周划分这个表(星期一开始工作日)。
有没有更好的方法一步完成,而不是将time_stamp从unix转换为TIMESTAMP(Vertica)然后再进行分区?
答案 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之间。