【问题标题】:how greenplum partition support varchar datatypegreenplum 分区如何支持 varchar 数据类型
【发布时间】:2020-11-08 07:16:59
【问题描述】:

脚本是:

create table T_RH_AJ_XW_JCJJJ2 (
   ZJ_ID                VARCHAR(32)          not null,
   JJ_RQ                VARCHAR(32),
   RK_SJ                TIMESTAMP,
   GX_SJ                TIMESTAMP,
   SJZT_W               VARCHAR(32)
)
distributed by (ZJ_ID)
partition by range (JJ_RQ)
(
     START ('2012-08-11'::date) END ('2012-08-12'::date)
     EVERY ( INTERVAL '1 day')
);   

我要分区使用varchar列(JJ_RQ数据类型,该列值为'2020-11-08'; 但这是一个错误:

错误是'运算符不存在:字符变化+间隔,没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

【问题讨论】:

    标签: database greenplum


    【解决方案1】:

    我从未使用过 Greenplum,但它基于 PostgreSQL,所以我会试一试:

    JJ_RQ 列的类型应为datetimestamp,因为EVERY 子句试图将INTERVAL 值添加到i。

    【讨论】:

    • 谢谢!是的,我知道JJ_RQ是日期类型还是时间戳类型,应该没错,但我想试试varchar类型。
    • @suhenhappy 你不能指望Greenplum 知道将INTERVAL 添加到VARCHAR 意味着什么。
    【解决方案2】:

    您应该修复您的表,以便 jj_rq 是时间戳或日期,以便以正确的方式执行此操作。但是如果你必须用 varchar 分区,那么你可以使用列表分区。

    create table T_RH_AJ_XW_JCJJJ2 (
       ZJ_ID                VARCHAR(32)          not null,
       JJ_RQ                VARCHAR(32),
       RK_SJ                TIMESTAMP,
       GX_SJ                TIMESTAMP,
       SJZT_W               VARCHAR(32)
    )
    distributed by (ZJ_ID)
    partition by list (JJ_RQ)
    (
         partition part1 values ('2012-08-11'),
         partition part2 values ('2012-08-12')
    ); 
    

    小表不会从分区中受益,所以我假设您的表大小较大。为帮助减少磁盘 I/O,您应该使用追加优化表并可能还使用压缩。文件更小,扫描时间更短。

    create table T_RH_AJ_XW_JCJJJ2 (
       ZJ_ID                VARCHAR(32)          not null,
       JJ_RQ                VARCHAR(32),
       RK_SJ                TIMESTAMP,
       GX_SJ                TIMESTAMP,
       SJZT_W               VARCHAR(32)
    )
    with (appendonly=true)
    distributed by (ZJ_ID)
    partition by list (JJ_RQ)
    (
         partition part1 values ('2012-08-11'),
         partition part2 values ('2012-08-12')
    );   
    

    这是修复数据类型的最佳方法。

    create table T_RH_AJ_XW_JCJJJ2 (
       ZJ_ID                VARCHAR(32)          not null,
       JJ_RQ                timestamp,
       RK_SJ                TIMESTAMP,
       GX_SJ                TIMESTAMP,
       SJZT_W               VARCHAR(32)
    )
    with (appendonly=true)
    distributed by (ZJ_ID)
    partition by range (JJ_RQ)
    (
    START ('2012-08-11'::timestamp) END ('2012-08-12'::timestamp)
    EVERY ( INTERVAL '1 day')
    );
    

    【讨论】:

    • ,非常感谢。我已经添加一列(Column:JJD_RQ type:date)来解决问题;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多