【问题标题】:Change the length of a variable in IMPALA SQL Select statement through SAS通过SAS改变IMPALA SQL Select语句中变量的长度
【发布时间】:2021-01-25 17:25:43
【问题描述】:

我正在连接到 impala 服务器以检索一些数据。 但是我想更改 impala 传递 sql 语句中变量的长度,否则它将检索长度为 32767 的未优化的变量。

这就是我在 SAS 中的做法:

proc sql;
    connect to impala (dsn="somedsn");
    create table want as
    select * 
    from connection to impala
        (select var1 length=50  
            from &disc_table.);
    disconnect from impala;
quit;

但是,由于IMPALA没有相同的sql语句结构,所以不起作用。

在 IMPALA SQL 语句中检索带有length=50var1 的正确语句是什么?

【问题讨论】:

    标签: sas impala proc-sql


    【解决方案1】:

    一种选择是更改 SAS 端 select 的长度:

    proc sql;
        connect to impala (dsn="somedsn");
        create table want as
        select var1 length=50 
        from connection to impala
            (select var1 
                from &disc_table.);
        disconnect from impala;
    quit;
    

    您也可以在连接步骤中使用我相信的DBMAX_TEXT 选项,尽管我并不特别熟悉 Impala 的选项。


    鉴于下面的 cmets,问题似乎在于 Impala 不支持 CHAR/VARCHAR,因此您会得到 32767 个长度的字符串。您的解决方案可能是同时做汤姆和我建议的事情,即:

    proc sql;
        connect to impala (dsn="somedsn");
        create table want as
        select var1 length=50 
        from connection to impala
            (select cast(var1 as varchar(50)) as var1 
               from &disc_table.);
        disconnect from impala;
    quit;
    

    这可能意味着您传回的数据更少,而您获得的列也更小;或者您可以在此处添加 DBMAX_TEXT;或者您也可以像kb article suggests 那样做,另外在 ODBC 连接选项中添加一个限制。

    另一种选择是使用SAS DS2,尽管它最终看起来仍然存在相同的问题(因为旧版本的 Impala 不支持 varchar/char)。该文件建议升级到 CDH 5.2(我认为这是 Impala 的 Cloudera 实现)。我不确定非 Cloudera 版本是否支持 VARCHAR,尽管在 3.4 版的 Impala change notes 中至少有一些提及,特别是 this issue 提到将其添加到 Kudu 表中。

    【讨论】:

    • 是的,我就是这样使用它的。但是我想把它放在 SQL 传递语句中,这样我从 Impala 下载的数据会更小。将查看DBMAX_TEXT 选项。谢谢。
    • 汤姆的答案和我的结合能解决吗? SAS 可能会为其分配 32767,但如果您使用 cast,Impala 可能只会分配 50。
    • 没有。我认为这只是很糟糕(cf.support.sas.com/kb/53/835.html
    • 在答案中添加了这个以及其他一些细节。
    【解决方案2】:

    您可以要求 IMPALA 将变量转换为具有正确长度的变量。

    ... (select cast(var1 as varchar(50)) as var1 from &disc_table.) ...
    

    【讨论】:

    • 使用(select cast(var1 as varchar(50)) as var1 from &disc_table.)长度还是32767
    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2021-03-21
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多