【问题标题】:Unload data into redshift in a specific partition format以特定分区格式将数据卸载到 redshift
【发布时间】: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= 前缀,有什么建议吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-redshift amazon-redshift-spectrum


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 2020-02-11
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      相关资源
      最近更新 更多