微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 GCS 存储桶中的多个文件与 Cloud Function 触发器合并

如何解决如何将 GCS 存储桶中的多个文件与 Cloud Function 触发器合并

每个名称每个日期有 3 个文件,格式如下: 'nameXX_date',这是一个例子: '姓名XX_01-01-20' 'nameXY_01-01-20' 'nameXZ_01-01-20'

其中“名称”可以是任何内容,日期是文件上传的哪一天(几乎每天)。

我需要编写一个云函数,每当有新文件进入存储桶时就会触发该函数,它将 3 个 XX、XY、XZ 文件合并到一个文件名 = "name_date" 的文件中。

这是我到目前为止所得到的:


bucket_id = 'bucketname'
client = gcs.Client()
bucket = client.get_bucket(bucket_id)

name = 
date =
outfile = f'bucketname/{name}_{date}.CSV'

blobs = []
for shard in ('XX','XY','XZ'):
    sfile = f'{name}{shard}_{date}'
    blob = bucket.blob(sfile)
    if not blob.exists():
        # this causes a retry in 60s
        raise ValueError(f'branch {sfile} not present')
    blobs.append(blob)
bucket.blob(outfile).compose(blobs)
logging.info(f'Successfullt created {outfile}')
for blob in blobs:
    blob.delete()
logging.info('Deleted {} blobs'.format(len(blobs)))

我面临的问题是我不知道如何获取落在存储桶中的新文件名称和日期,以便我可以找到其他 2 个匹配的文件并将它们组合起来

顺便说一句,我从这篇文章中得到了这段代码,我正在尝试在这里实现它:https://medium.com/google-cloud/how-to-write-to-a-single-shard-on-google-cloud-storage-efficiently-using-cloud-dataflow-and-cloud-3aeef1732325

解决方法

据我所知,云函数是由特定 GCS 存储桶中对象上的 google.storage.object.finalize 事件触发的。

在这种情况下,您的云函数“签名”看起来像(取自您提到的“中等”文章):

def compose_shards(data,context):

data 是一本字典,其中包含有关对象(文件)已 finalized 的大量详细信息。在此处查看一些详细信息:Google Cloud Storage Triggers

例如,data["name"] - 是讨论对象的名称。

如果您知道命名这些对象/分片所依据的模式/模板/规则,则可以从对象/分片名称中提取相关元素,并使用它来组成目标对象/文件名。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。