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

标签 r csv amazon-s3

我需要将一个包含约 1800 万行和 7 列的 3 GB csv 文件分别从 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)

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

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

阅读this post ,我知道向量太长,但是在这种情况下我将如何对数据进行子集化?对于如何处理从 S3 读取的较大文件还有其他建议吗?

最佳答案

最初基于 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")

会成功的。但是,如果您想让您的工作运行得更快、更干净,我更喜欢这样:

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。更多信息可参见the Base R tempfile docs. .

关于将大型 csv 文件从 S3 读取到 R 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46668533/

相关文章:

r - 合并名称相似的列

R:通过计算另一个数据帧中 CSV 列中字符串的出现次数,将计数出现列添加到数据帧

python - 到最近的 AWS 区域的客户端 IP 地址

java - 找不到 awssdk_config_override.json 文件 - 异常 AWSSDK

amazon-web-services - Next.js:托管在 AWS Cloudfront 上时,如何使链接与导出的站点一起使用?

r - 字符串分割的模式如何成为子字符串本身?

r - Sparklyr - 无法实例化 SessionHiveMetaStoreClient

python - 对于没有空值和附加的单元格的循环检查

python - 需要帮助将大文本文件裁剪为多个带标题的小文本文件

php - 使用 PHP 将 CSV 文件上传到数据库时出错