在 Redshift 中,如何复制表、添加 dist 和排序键以及保留列编码?

问题描述 投票:0回答:3

我想在 Redshift 中复制一个表,这样我就可以保留现有的列编码,同时添加 DIST 和 SORT 键。有没有一种简单的可重复的方法来做到这一点?

之前我复制了表DDL(没有编码),分析表,手动键入列编码,手动添加DIST和SORT键,创建新表,插入数据,删除旧表,然后更改新的。这非常耗时并且容易出错。

有更好的方法吗?

sql amazon-web-services amazon-redshift
3个回答
3
投票

Redshift 自动对新的空表应用压缩。请注意,在这种情况下,它通常默认为

LZO

您可以在

DISTKEY
查询中指定
SORTKEY
CREATE TABLE … AS
。所以做你想做的最简单的方法是:

CREATE TABLE new_table 
DISTKEY(new_dist_col) 
SORTKEY(new_sortkey_1, new_sortkey_2)
AS 
SELECT * FROM old_table;

编辑:要保留现有编码,请使用 Utils 库中的

v_generate_tbl_ddl
视图 获取现有表的 DDL 和编码。然后修改它以创建新目标并从旧表中创建
INSERT INTO

SELECT ddl 
FROM admin.v_generate_tbl_ddl 
WHERE tablename = 'old_table'
;
                   ddl
-------------------------------------------------
 --DROP TABLE "my_schema"."old_table";
 CREATE TABLE IF NOT EXISTS "my_schema"."old_table"
 (
         "dist_col" BIGINT   ENCODE zstd
         ,"sortkey_2" TIMESTAMP
         ,"sortkey_1" NUMERIC(28,4)   ENCODE zstd
         ,"column_d" VARCHAR(256)   ENCODE zstd
 )
 DISTSTYLE KEY
 DISTKEY ("dist_col")
 SORTKEY (
         "sortkey_2"
         "sortkey_1"
         )
 ;

0
投票

您可以解析内置元数据表“information_schema.tables”和“information_schema.columns”(以及其他),以便以编程方式确定表定义。然后可以完全自动创建新的表克隆,并将一个表中的所有行插入另一个表中。


0
投票

Amazon (AWS Labs) 维护着一个

amazon-redshift-utils
存储库,其中包含
ColumnEncodingUtility
,它支持就地 更新分布和排序键(除了优化列编码压缩的主要功能之外)对于现有表格)。

此实用程序仅执行您问题中概述的迁移过程(根据原始 DDL 创建新表,更新列编码和 DIST/SORT 键,使用 INSERT...SELECT... 迁移数据,然后更改重命名新表来替换旧的)。然而,该实用程序完全自动化了该过程,并且由亚马逊官方维护,因此与每次手动执行这些步骤相比,它更不容易出错。

© www.soinside.com 2019 - 2024. All rights reserved.