使用generate_series创建表

时间:2014-11-03 18:30:07

标签: postgresql amazon-redshift generate-series

在Amazon Redshift中,领导节点似乎支持generate_series(),但计算节点上不支持with date_table as (select now()::date - generate_series(0, 7 * 10) as date), hour_table as (select generate_series(0, 24) as hour), time_table as ( select date_table.date::date as date, extract(year from date_table.date) as year, extract(month from date_table.date) as month, extract(day from date_table.date) as day, hour_table.hour from date_table CROSS JOIN hour_table ) SELECT * from time_table 。有没有办法使用generate_series在领导节点上创建表,然后将其推送到计算节点?

此查询运行正常,在领导节点上运行:

create table test
diststyle all
as (
  with
      date_table as (select now()::date - generate_series(0, 7 * 10) as date),
      hour_table as (select generate_series(0, 24) as hour),
      time_table as (
        select 
          date_table.date::date as date,
          extract(year from date_table.date) as year,
          extract(month from date_table.date) as month,
          extract(day from date_table.date) as day,
          hour_table.hour
    from date_table CROSS JOIN hour_table
)
  SELECT * 
  from time_table 
);

但是,此查询失败:

create table test diststyle all as (select 1 as a, 2 as b);
select * from test

我现在能想到的唯一解决方案是将查询结果拉到另一个程序(例如python)中,然后将结果插入到数据库中,但这似乎是hackish。

对于那些从未使用过redshift的人来说,它是postgresql的一个经过大量修改的变种,并且有许多自己的特性。以下查询完全有效,运行正常:

a   b
1   2

的产率:

{{1}}

问题源于leadernode only函数和redshift上的计算节点函数之间的区别。我很确定这不是因为我的查询中存在错误。

1 个答案:

答案 0 :(得分:1)

我还没有找到一种方法来使用仅限leader-node的函数来创建表。没有(AFAICT)可以使用任何魔术语法使它们将输出加载回表。

我最终使用数字表来实现类似的结果。即使是数量庞大的表,也会占用Redflow集群上的游程长度压缩空间非常小。