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

我有一个大表需要卸载到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=前缀,有什么建议吗?

iCMS 回答:以特定分区格式将数据卸载到redshift中

格式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()
本文链接:https://www.f2er.com/2153803.html

大家都在问