以特定分区格式将数据卸载到 redshift

Posted

技术标签:

【中文标题】以特定分区格式将数据卸载到 redshift【英文标题】:Unload data into redshift in a specific partition format 【发布时间】:2020-06-11 13:58:26 【问题描述】:

我有一张大表需要卸载到S3,按year and month分区,这样就实现了下面的文件夹结构。

bucket_name/folder_name/year/month/

到目前为止,我正在这样做:

unload ( 'select *, extract(year from question_asked_at) as year, extract(month from question_asked_at) as month from schema_name.table_name'
to 's3://bucket_name/folder_name/'
iam_role <iam_role>
partition by (year, month);

结果是: bucket_name/folder_name/year=2001/month=01/, bucket_name/folder_name/year=2001/month=02/

分区有效,但我需要删除 year=month= 前缀,有什么建议吗?

【问题讨论】:

【参考方案1】:

partition_column=value 格式是 Hive 创造的约定。 Redshift UNLOAD 遵循该约定(请参阅Redshift manual for UNLOAD

我认为要实现您的目标,您需要将文件移动到新前缀(没有year=month=)作为一个单独的过程,使用例如。 bash 或 python 和一些正则表达式魔法。


我试图用boto3写下如何做到这一点,这就是我想出的:

import boto3
import re

s3 = boto3.resource("s3")

bucket_name = "sbochniak-zalon-eu-central-1"
prefix = "firehose_zalon_backend_events/"

keys = [
    o.key
    for o in
    s3.Bucket(bucket_name).objects.filter(Prefix=prefix).all()
]

new_keys = [
    re.sub('^(.*)year=(\w+)(.*)month=(\w+)(.*)$', r'\1\2\3\4\5', k)
    for k in
    keys
]

for old_key, new_key in zip(keys, new_keys):
    s3.Object(bucket_name, new_key).copy_from(CopySource="Bucket": bucket_name, "Key": old_key)
    s3.Object(bucket_name, old_key).delete()

【讨论】:

以上是关于以特定分区格式将数据卸载到 redshift的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spectrify 以 Parquet 格式将数据从 Redshift 卸载到 S3

挂载卸载分区总结

Linux下进行硬盘挂载分区删除分区,格式化,挂载,卸载方法

树莓派-磁盘分区、格式化、挂载、卸载

Linux文件系统之挂载/卸载

如何使用小写列名以镶木地板格式从 Snowflake 中卸载数据?