如何解决如何在 Redshift 中将系统表或信息架构表与用户定义的表连接起来
我需要将 Redshift information schema
表与 User defined
表连接起来。我尝试了以下查询并收到了提到的错误。
select *
from pg_table_def a join user_defined_table b
on 1 = 1 -- condition just to give an example
where tablename = 'table1';
sql Error [500310] [0A000]: [Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;
select *
from information_schema.columns a join user_defined_table b
on 1 =1 -- condition just to give an example
where a.table_name = 'table1';
sql Error [500310] [0A000]: [Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;
可能是我缺少一些基础知识,请提出建议。
解决方法
当您发现存在于领导节点上的目录表与普通表有很大不同时。将这些表中的数据与普通表结合使用的方法是将这些目录表中的数据保存为普通表。然后可以根据您的尝试组合数据。
没有从这些表直接到普通表不从目录中选择的路径(据我所知)。因此,您可以从 redshift 中选择此数据,然后将其作为带有脚本或程序的普通表放回。或者,您可以通过选择光标并将光标读入普通表格来执行与此几乎等效的操作。可以使用存储过程完成从游标的读取。我们先看看这条路。
下面的代码创建了一个存储过程,使普通表“fred”选择pg_table_def数据放入fred,然后执行存储过程,最后选择fred中存储的内容。
CREATE OR REPLACE procedure rewrite_data()
AS
$$
DECLARE
row record;
BEGIN
drop table if exists fred;
create table fred (schemaname varchar(256),tablename varchar(256),"column"varchar(256),"type"varchar(256));
for row in select "schemaname"::text,"tablename"::text,"column"::text,"type"::text from pg_table_def where "schemaname" <> 'pg_catalog' LOOP
INSERT INTO fred(schemaname,tablename,"column","type") VALUES (row.schemaname,row.tablename,row."column",row."type");
END LOOP;
END;
$$ LANGUAGE plpgsql;
call rewrite_data();
select * from fred;
这个过程工作正常,但是一次遍历游标一行很慢,在我们进行时将一行插入到 fred 中。这个过程适用于小事情,但一些目录表相当大。这个过程的好处在于,fred 的更新可以在需要时作为 SQL 调用来完成。这个过程对于需要由其他 SQL 启动的小更新来说非常好。
在大量行上循环的速度是游标/存储过程方法的缺点。在 1000 行游标上循环 10 秒。因此,如果您需要将大量仅限领导节点的目录数据复制到普通表中,您将需要看起来更像 ETL 过程的东西。读取目录表,将其写入 S3,然后将其复制到您的表中。这很容易做到,而且速度相当快,但不能由 SQL 命令启动,因此这些表在使用时会过时一些(这些表在上次更新时是正确的)。>
因此,没有完美的解决方案,只有一些可行的解决方案,具体取决于您的需求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。