繁体   English   中英

从S3读取大型csv文件到R

[英]Read large csv file from S3 into R

我需要从S3分别向R或RStudio加载一个3 GB的csv文件,该文件包含大约1800万行和7列。 我从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读取的较大文件?

您可以使用AWS Athena并将S3文件安装到athena并仅将选择性记录查询到R。下面将详细说明如何使用athena运行r。

https://aws.amazon.com/blogs/big-data/running-r-on-amazon-athena/

希望能帮助到你。

如果您使用的是Spark或类似产品,则另一个解决方法是-将cv读取/加载到DataTable中,以及-继续使用R Server / sparklyr处理它

最初是基于OP中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()可以提供一些见解-请参见TMPDIR TEMPTMP 可以在Base R tempfile文档中找到更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM