如何在 Redshift 中查询架构信息?

Posted

技术标签:

【中文标题】如何在 Redshift 中查询架构信息?【英文标题】:How to query the schema info in Redshift? 【发布时间】:2019-08-22 07:57:47 【问题描述】:

我收到以下错误:

ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.

我明白这是因为我试图只使用领导节点功能,但有其他方法可以做同样的事情吗?

我在 Redshift 数据库上的 Amazon Data Pipeline 中运行它。

CREATE TABLE "schema_n"."temp_variable"
AS    
SELECT CASE WHEN (NOT EXISTS(SELECT 1 FROM PG_TABLE_DEF pgtd WHERE schemaname = 'schema_xyz' AND tablename = 'table_xyz')) OR (DATE_PART('dow', CURRENT_DATE) = 0)
         THEN '2017-01-01'::DATE 
        ELSE CURRENT_DATE - 11
        END AS "date_import";

我也试过了:

CREATE TABLE "schema_n"."temp_variable"
AS    
SELECT CASE WHEN (NOT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = 'schema_xyz' AND table_name = 'table_xyz')) OR (DATE_PART('dow', CURRENT_DATE) = 0)
          THEN '2017-01-01'::DATE 
        ELSE CURRENT_DATE - 11
        END AS "date_import";

基本上我正在尝试执行以下操作:

如果 table_xyz 不存在或者是星期天,返回 '2017-01-01' 否则返回今天 - 11 天。

无论我尝试什么,我总是遇到同样的错误:

ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.

【问题讨论】:

对不起,我在 CASE 语句的开头添加了 SELECT。基本上,我将此返回值存储在一个表中,然后将其用作 ETL 的时间变量。 @JonScott 它们在从客户端运行时工作,但在管道中它们返回一条消息。 我不知道 ctas 在这里不起作用。我将其更改为正确的表声明,它仍然返回相同的错误。 唯一的解决方法是在 redshift 外部运行选择查询(例如 python 脚本),将值返回给 python 脚本,然后在下一步中(在脚本内部)将这些值插入到您的目标表。如果您使用的是数据管道,此信息对您没有帮助。考虑迁移到 Apache Airflow 以获得更好的控制。 【参考方案1】:

最后,管道中唯一有效的方法是使用 svv_table_info 表来执行此操作。

CREATE TABLE "schema_n"."temp_variable" (
   "date_import" DATE;

INSERT INTO "schema_n"."temp_variable"
SELECT
    CASE WHEN (NOT EXISTS(SELECT 1 FROM svv_table_info WHERE "schema" = 'schema_xyz' AND "table" = 'table_xyz')) OR (DATE_PART('dow', CURRENT_DATE) = 0)
        THEN '2017-01-01'::DATE 
    ELSE CURRENT_DATE - 11
    END AS "date_import";

【讨论】:

以上是关于如何在 Redshift 中查询架构信息?的主要内容,如果未能解决你的问题,请参考以下文章

Redshift集群,如何获取片数信息

Redshift - 如何识别查询中的低性能区域?

将 Spark 架构转换为 Redshift Spectrum 嵌套架构

Redshift 表 - 查找表上查询的最后日期

如何在redshift中查询kms加密数据

如何在 python udf 中使用 select 查询进行 redshift?