【发布时间】:2014-02-07 20:39:40
【问题描述】:
我正在尝试在 Amazon Redshift 中实施一个 ETL 流程,该流程需要自动重新创建某些表,并且我需要脚本仅在这些表已经存在于数据库中时删除它们。
是否有任何表格目录可供我检查表格是否存在?还是类似于 PSQL 中的DROP TABLE IF EXISTS 的命令?
【问题讨论】:
标签: sql amazon-web-services amazon-redshift
我正在尝试在 Amazon Redshift 中实施一个 ETL 流程,该流程需要自动重新创建某些表,并且我需要脚本仅在这些表已经存在于数据库中时删除它们。
是否有任何表格目录可供我检查表格是否存在?还是类似于 PSQL 中的DROP TABLE IF EXISTS 的命令?
【问题讨论】:
标签: sql amazon-web-services amazon-redshift
更新:
现在 Redshift 支持带有 IF EXISTS 子句的 DROP TABLE。 http://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html
由于 Redshift 不支持 DROP TABLE IF EXISTS,我们通过获取现有表名来处理它。
为了在 Redshift 上获取表名,我使用了 pg_table_def 表。例如,我运行以下 sql 来获取除系统表之外的所有表名。
SELECT
schemaname, tablename
FROM
pg_table_def
WHERE
schemaname <> 'pg_catalog'
AND schemaname <> 'information_schema'
AND schemaname !~ '^pg_toast'
GROUP BY
schemaname,tablename;
这是一个示例结果。
schemaname | tablename
------------+-----------
my_schema | access_log
my_schema | error_log
my_schema | vmstats_log
public | users
public | groups
详情请看以下链接。
【讨论】:
IF 结合使用?我看到 IF 在 RedShift 中似乎也不存在。或者这是否必须在发出多个语句的自定义脚本中发生?
如果不删除表,而是进行插入覆盖,怎么样?
INSERT OVERWRITE INTO target
SELECT s.* FROM staging s LEFT JOIN target t
ON s.primaryKey = t.primaryKey AND s.distKey = t.distKey
WHERE t.primaryKey IS NULL;
否则,请尝试向我解释您为什么要这样做,我会在更多帮助下进行更新。这是一个例子,通过红移设计,你不能做你想做的事情通常是有原因的,但是有一种“红移”的方式。
【讨论】: