从S3读取大型csv文件到R

Rya*_*yan 9 csv r amazon-s3

我需要加载一个3 GB的csv文件,其中包含大约1800万行和7列从S3到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)
Run Code Online (Sandbox Code Playgroud)

现在,由于文件比平时大得多,我收到一个错误

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

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

lee*_*sej 6

最初基于 Hugh 在 OP 中的评论,并为那些希望从 s3 加载常规大小的 csv 的人添加答案。

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

因此

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

会做的伎俩。但是,如果你想让你的工作运行得更快更干净,我更喜欢这样:

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

以前需要以下更详细的方法:

library(aws.s3)

data <- 
  save_object("s3://myBucketName/directoryName/fileName.csv") %>%
  data.table::fread()
Run Code Online (Sandbox Code Playgroud)

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

使用加载的每个 csv 的副本填充工作目录的更好替代方法:

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

如果您对临时文件的位置感到好奇,那么 Sys.getenv()可以提供一些见解 - 请参阅TMPDIR TEMPTMP. 更多信息可以在Base R 临时文件文档中找到。.


Kan*_*yan 2

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

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

希望能帮助到你。