【问题标题】:Write R data as csv directly to s3将R数据作为csv直接写入s3
【发布时间】:2015-07-17 01:17:22
【问题描述】:

我希望能够将数据从data.frame\ data.table 对象作为 csv 文件直接写入 AWS s3 中的存储桶,而无需先使用 AWS CLI 将其写入磁盘。

obj.to.write.s3 <- data.frame(cbind(x1=rnorm(1e6),x2=rnorm(1e6,5,10),x3=rnorm(1e6,20,1)))

目前我先写入 csv,然后上传到现有存储桶,然后使用以下方法删除文件:

fn <- 'new-file-name.csv'
write.csv(obj.to.write.s3,file=fn)
system(paste0('aws s3 ',fn,' s3://my-bucket-name/',fn))
system(paste0('rm ',fn))

我想要一个直接写入 s3 的函数?这可能吗?

【问题讨论】:

    标签: r csv amazon-web-services amazon-s3


    【解决方案1】:

    aws.s3 0.2.2 中添加了s3write_using()(和s3read_using())函数。

    它们让事情变得更简单:

    s3write_using(iris, FUN = write.csv,
                        bucket = "bucketname",
                        object = "objectname")
    

    【讨论】:

    • 这个不错,你也可以使用这个功能来轻松保存拼花文件-s3write_using(iris, FUN = arrow::write_parquet, bucket = "bucketname", object = "objectname")
    • 对象名指的是什么? S3 存储桶中的文件夹?
    • @nak5120 在 s3 中并没有真正的“文件夹”(在 Google 中查找),您认为文件夹实际上是对象名称的一部分,而您应该在objectname 中提供
    • 值得注意的是,使用s3write_using 确实使事情变得更简单,但也会在将文件放入 S3 之前将其写入本地磁盘。
    【解决方案2】:

    最简单的解决方案是将 .csv 保存在 tempfile() 中,当您关闭 R 会话时,它将自动清除。

    如果您只需要在内存中工作,您可以通过 write.csv() 对 rawConnection 执行此操作:

    # write to an in-memory raw connection
    zz <- rawConnection(raw(0), "r+")
    write.csv(iris, zz)
    
    # upload the object to S3
    aws.s3::put_object(file = rawConnectionValue(zz),
        bucket = "bucketname", object = "iris.csv")
    
    # close the connection
    close(zz)
    

    如果您不确定,您可以通过从 S3 下载对象并将其读回 R 来检查它是否正常工作:

    # check that it worked
    ## (option 1: save locally)
    save_object(object = "iris.csv", bucket = "bucketname", file = "iris.csv")
    read.csv("iris.csv")
    ## (option 2: keep in memory)
    read.csv(text = rawToChar(get_object(object = "iris.csv", bucket = "bucketname")))
    

    【讨论】:

      【解决方案3】:

      当然——但“保存到文件”要求您的操作系统将所需的目标目录视为可访问的文件系统。所以本质上你“只是”需要安装 S3。这是该主题的quick Google search

      另一种方法是写入临时文件,然后使用您用来传输文件的任何内容。您可以将这两个操作编码为一个简单的辅助函数。

      【讨论】:

        猜你喜欢
        • 2020-05-29
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 2015-11-10
        相关资源
        最近更新 更多