以特定分区格式将数据卸载到 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