将R数据直接写为csv到s3

h.l*_*l.m 16 csv r amazon-s3 amazon-web-services

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

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

目前我先写入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))
Run Code Online (Sandbox Code Playgroud)

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

lee*_*sej 14

aws.s3 0.2.2所述s3write_using()(和s3read_using())函数中加入.

他们使事情变得更简单:

s3write_using(iris, FUN = write.csv,
                    bucket = "bucketname",
                    object = "objectname")
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,使用“s3write_using”确实使事情变得更简单,而且还会在将文件放入 S3 之前将文件写入本地磁盘。 (2认同)

Tho*_*mas 5

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

如果您只需要在内存中工作,可以通过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)
Run Code Online (Sandbox Code Playgroud)

如果您不确定,可以通过从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")))
Run Code Online (Sandbox Code Playgroud)


Dir*_*tel 0

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

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