使用aws_s3.table_import_from_s3将CSV从S3复制到A PostgreSQL RDS示例时,添加具有默认值的新列

siv3szwd  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

我正在从S3导入CSV文件。问题是我需要添加一个唯一标识符,因为所有数据都将存储在PostgreSQL的公共表中,我们需要知道数据来自哪个S3存储桶。
我不想解析数据并插入,因为CSV可能包含数千行,这将大大降低速度。
到目前为止,我们一直在为每个s3导入创建一个新的临时表,但是我们需要使用一个公共的永久表来提出一个不同的解决方案。

ni65a41a

ni65a41a1#

您可以(可选地)命名要插入的表中的列,这一点非常有用。
假设您正在将数据加载到一个名为loaded_data的表中,该表具有以下结构:

create table loaded_data (
 a text,
 b text,
 c text,
 source_bucket text);

数据文件将a、B和c的值保存在逗号分隔的文件中。
下面的代码将加载列a、B和c,并将source_bucket保留为null:

postgres=> SELECT aws_s3.table_import_from_s3(
   'loaded_data',
   'a,b,c', 
   '(format csv)',
   :'s3_uri'
);

接着说

update data_table
set source_bucket = 'name of the current bucket'
where source_file is null;

确保这发生在事务中,这样就不会出现令人讨厌的竞态条件。
或者,您可以使用source_bucket的默认值,在每次加载之前设置该值。这将避免追溯更新语句。

ALTER TABLE loaded_data ALTER COLUMN source_bucket SET DEFAULT 'bucket2';

postgres=> SELECT aws_s3.table_import_from_s3(
   'loaded_data',
   'a,b,c', 
   '(format csv)',
   :'s3_uri'
);

更多信息和示例请参见此处:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PostgreSQL.S3Import.html#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter

相关问题