在Amazon Redshift中,leader节点似乎支持generate_series()
,但计算节点不支持。有没有一种方法可以使用generate_series在leader节点上创建一个表,然后将其推送到计算节点?
此查询运行良好,在leader节点上运行:
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 (
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
);
我现在能想到的唯一解决方案是将查询结果拉到另一个程序(例如python)中,然后将结果插入数据库,但这似乎很难。
对于那些从未使用过红移的人来说,它是postgresql的一个经过大量修改的变体,并且有很多自己的特性。以下查询完全有效,运行良好:
create table test diststyle all as (select 1 as a, 2 as b);
select * from test
收益率:
a b
1 2
该问题源于仅leadernode函数和红移上的计算节点函数之间的差异。我很确定这不是由于我的查询中的错误。
我还没有找到一种方法来使用leader node-only函数来创建表。没有(AFAICT)任何神奇的语法可以用来让它们将输出加载回表。
我最终使用了数字表来实现类似的结果。即使是一个巨大的数字表也会占用运行长度压缩的Redshift集群上非常小的空间。