【问题标题】:redshift - how to insert into table generated time seriesredshift - 如何插入表生成的时间序列
【发布时间】:2019-08-01 05:22:39
【问题描述】:

我正在尝试在 Redshift 中生成时间序列并插入到表中,但没有运气。到目前为止我尝试过的:

insert into date(dateid,date)
SELECT
    to_char(datum, 'YYYYMMDD')::int AS dateid,
    datum::date AS date
FROM (
    select '1970-01-01'::date + generate_series(0, 20000) as datum
     ) tbl;

得到以下错误

SQL Error [500310] [0A000]: [Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;

有什么想法或解决方法吗?

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift


    【解决方案1】:

    问题是generate_series() 可以在领导节点上运行,但不能在计算节点上运行

    因此,可以运行这样的语句:

    SELECT '1970-01-01'::date + generate_series(0, 20000)
    

    但是,不能在 FROM 中使用该语句,因为这会涉及计算节点。

    解决方案: 在外部创建信息表并将结果加载到date 表中,或者直接使用generate_series() 生成所需的值,保存结果并导入到@ 987654326@表。

    【讨论】:

    • 我基本上写了一个 Talend 作业,它使用 generate_series() 进行选择并动态插入到表格中
    【解决方案2】:

    generate_series 函数在 Redshift 上不起作用

    它确实会产生混淆!这是因为在您尝试写入表之前,它看起来工作正常。

    从技术上讲,这样做的原因是它只能在领导节点上工作。并且领导节点本身没有直接访问表的权限。

    如果你尝试

    SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime
    FROM generate_series(1,31) i
    ORDER BY 1;
    

    这会产生一个不错的表输出,因为它已在领导节点上运行。

    但是 如果你运行

    create table test as
    SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime
    FROM generate_series(1,31) i
    ORDER BY 1;
    

    这失败了

    [2019-03-11 07:38:00] [0A000] 错误:指定的类型或函数(一个 每个 INFO 消息)在 Redshift 表上不受支持。 [2019-03-11 07:38:00] [00000] 函数“generate_series(整数,整数)”不是 支持。

    这是因为我们现在正在尝试创建一个表,所以 sql 必须在工作节点(而不是领导节点)上运行,所以它失败了。

    【讨论】:

    • 。 .如果您将generate_series() 放在 CTE 中,这行得通吗?
    • 不,它没有——在 redshift 中,cte 就像一个子查询(不像 postgres)。 (我确实测试了它以防万一 - 同样的错误)
    猜你喜欢
    • 2022-12-04
    • 2021-04-23
    • 1970-01-01
    • 2017-10-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多