从S3中读取大型csv文件到R中

13

我需要从S3中加载一个大小约为3GB,包含大约1800万行和7列的csv文件到R或者RStudio。我的用于从S3读取数据的代码通常是这样的:

library("aws.s3")
obj <-get_object("s3://myBucketName/aFolder/fileName.csv")  
csvcharobj <- rawToChar(obj)  
con <- textConnection(csvcharobj)  
data <- read.csv(file = con)

现在,由于文件比平常要大得多,我收到了一个错误。

> csvcharobj <- rawToChar(obj)  
Error in rawToChar(obj) : long vectors not supported yet: raw.c:68

阅读这篇帖子后,我理解向量太长了,但在这种情况下我该如何对数据进行子集化?还有其他建议,如何处理从S3读取的大文件?


使用 skipnrows 参数以块的方式读取文件?使用 data.table::fread [带有类似参数] 可能会大大提高速度(或者使用 readr::read_csv,但我猜测 fread 更快)。 - Ben Bolker
2
save_object("s3://myBucketName/aFolder/fileName.csv", file = "myfile.csv"); data.table::fread("myfile.csv") 这段代码能够正常工作吗? - Hugh
1
@Hugh save_object(... 导致了另一个问题:Error in writeBin(httr::content(r, as = "raw"), con = file) : long vectors not supported yet: ../../../../R-3.4.3/src/main/connections.c:4147 - mmell
3个回答

10

最初建立在Hugh的评论基础上,并为希望从s3加载常规大小csv文件的人添加答案。

至少截至2019年5月1日,有一个 s3read_using()函数,允许您直接从存储桶中读取对象。

因此,

data <- 
    aws.s3::s3read_using(read.csv, object = "s3://your_bucketname/your_object_name.csv.gz")

这可以解决问题。但是,如果你想让你的工作更快速、更清洁,我推荐这种写法:

data <- 
    aws.s3::s3read_using(fread, object = "s3://your_bucketname/your_object_name.csv.gz") %>%
    janitor::clean_names()

以前需要使用以下更冗长的方法:

以前需要使用以下更冗长的方法:

library(aws.s3)

data <- 
  save_object("s3://myBucketName/directoryName/fileName.csv") %>%
  data.table::fread()

它适用于至少305 MB的文件。

一个更好的替代方案是,不要在您的工作目录中存储每个加载的csv文件的副本:

data <- 
  save_object("s3://myBucketName/directoryName/fileName.csv",
              file = tempfile(fileext = ".csv")
             ) %>%
  fread()

如果你想知道临时文件的位置,那么可以使用 Sys.getenv() 函数来获取一些信息 - 可以查看 TMPDIRTEMP 或者 TMP。更多信息可以在Base R tempfile文档中找到。


2

1
如果您正在使用Spark或类似工具,则另一种解决方法是: - 将CSV文件读取/加载到DataTable中 - 然后使用R Server / sparklyr继续处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接