【问题标题】:Create a table using `pg_table_def` data in Redshift or DBT使用 Redshift 或 DBT 中的 pg_table_def 数据创建表
【发布时间】:2020-06-16 08:08:06
【问题描述】:

为了从pg_table_def 中对我的用户可见的所有数据创建一个表,我尝试了:

create table adhoc_schema.pg_table_dump as ( 
  select *
  from pg_table_def
);

但是它会抛出一个错误:

列“schemaname”的类型“name”不受支持

有什么方法可以从pg_table_definformation_schema.columns 创建表?

【问题讨论】:

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


    【解决方案1】:

    从另一个帖子中找到了这个,这似乎会有所帮助。

    亚马逊会考虑 INFORMATION_SCHEMA.COLUMNS 使用的仅领导节点函数的内部函数。亚马逊并没有明智地重新定义标准化的 INFORMATION_SCHEMA.COLUMNS,而是试图定义自己的专有版本。为此,他们提供了另一个功能 PG_TABLE_DEF 似乎可以满足相同的需求。请注意中心关于将架构添加到 search_path 的注释。

    存储有关表列的信息。

    PG_TABLE_DEF 仅返回有关用户可见的表的信息。如果 PG_TABLE_DEF 未返回预期结果,请验证 search_path 参数是否设置正确以包含相关架构。

    您可以使用 SVV_TABLE_INFO 查看有关表的更全面的信息,包括数据分布偏斜、键分布偏斜、表大小和统计信息。

    所以使用您的示例代码(为了清楚起见,重写为使用 NOT EXISTS),

    SET SEARCH_PATH to '$user', 'public', 'target_schema';
    
    SELECT "column" 
    FROM dev.fields f
    WHERE NOT EXISTS (
      SELECT 1
      FROM PG_TABLE_DEF pgtd
      WHERE pgtd.column = f.field
      AND schemaname = 'target_schema'
    );
    

    另见,

    查询 Redshift 系统表的官方文档:https://docs.aws.amazon.com/redshift/latest/dg/t_querying_redshift_system_tables.html

    【讨论】:

    • 如果这来自另一个线程,请务必提供一个链接/引用返回到该线程。
    【解决方案2】:

    pg_table_def 是一个领导节点系统表,其中包含一些用户表不支持的附加数据类型。您需要先转换为文本。

    但是,这仍然行不通,因为 pg_table_def 是领导节点表,而您正在创建的表是存储在计算节点上的用户表。您需要从存储在计算节点上的表中提取源信息。由于我不知道您要从 pg_table_def 中查找哪些信息,因此我无法确切说明您需要哪些信息,但您可以从 stv_tbl_perm 开始,并在需要更多信息时加入 pg_class 和其他表。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2017-11-17
      • 2023-01-16
      • 2021-02-17
      • 2021-05-30
      • 2023-02-20
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多