使用 aws.s3 包从 AWS S3 一次读取多个 CSV 文件对象

Posted

技术标签:

【中文标题】使用 aws.s3 包从 AWS S3 一次读取多个 CSV 文件对象【英文标题】:Reading multiple CSV files object at once from AWS S3 using aws.s3 package 【发布时间】:2019-08-22 09:17:04 【问题描述】:

我需要使用 R 中的 aws.s3 包从 AWS S3 存储桶中读取多个 csv 文件,最后将这些文件合并到单个数据框中以进行进一步分析。

假设我的 S3 存储桶中有几个文件,例如 "variables_2019-08-12.csv" 、 "variables_2019-08-13.csv 和 "variables_2019-08-14.csv rtc。

我正在使用aws.s3::s3read_using,但对于object 部分,我每次只能读取一个 csv 文件。文件的名称中有一个日期,所以我想知道如何在这里添加一个循环:

my_file <- 
s3read_using(FUN = read_csv, object = "variables_2019-08-12.csv", bucket = "my_bucket")

【问题讨论】:

【参考方案1】:

在 R 中有很多方法可以做到这一点,但对我来说最直观的是使用 purrr 包中的map_dfr

objects = c('variables_2019-08-12.csv', 'variables_2019-08-13.csv', …)
names(objects) = gsub('variables_(.*)\\.csv', '\\1', objects)
df = map_dfr(
    objects,
    ~ s3read_using(FUN = read_csv, object = .x, bucket = 'my_bucket'),
    .id = 'Date'
)

由于分配了names(objects),并且我们指定了.id = 'Date',因此生成的数据框将有一个额外的列,其中包含每个条目的日期(基于文件名)。

【讨论】:

谢谢@Konrad,如果我们有 100 个 csv 文件,只有一个问题,我想像 startdate=*_2019-08-15 enddate=*_2019-08-21 for(i in startdate:enddate) .... 这样循环。这样做是否正确? 是的,没错。我只需要创建一系列 sting 对象 + 日期来将其输入到对象向量中。很棒

以上是关于使用 aws.s3 包从 AWS S3 一次读取多个 CSV 文件对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Lambda 从 AWS S3 读取和提取巨大的 zip 文件

多个 AWS Lambda 中的 AWS::S3::Bucket LambdaConfiguration

使用其预签名 URL 从 AWS s3 读取文件的内容

使用默认 aws/S3 KMS 密钥对解密对象进行跨账户访问

在 Golang 中从 AWS S3 读取文件

我如何监视用户对AWS S3的访问?