将大型 csv 文件从 S3 读入 R
Posted
技术标签:
【中文标题】将大型 csv 文件从 S3 读入 R【英文标题】:Read large csv file from S3 into R 【发布时间】:2017-10-10 13:51:13 【问题描述】:我需要将一个 3 GB 的 csv 文件分别从 S3 加载到 R 或 RStudio 中,其中包含大约 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
阅读this post,我知道向量太长了,但在这种情况下我将如何对数据进行子集化?还有其他建议如何处理要从 S3 读取的较大文件吗?
【问题讨论】:
使用skip
和nrows
参数分块读取文件?使用data.table::fread
[带有类似参数] 可能会在速度上产生巨大 差异(或readr::read_csv
,但我猜fread
更快)
save_object("s3://myBucketName/aFolder/fileName.csv", file = "myfile.csv"); data.table::fread("myfile.csv")
工作吗?
@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
【参考方案1】:
最初基于 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
TEMP
或 TMP
。更多信息可以在the Base R tempfile docs.找到。
【讨论】:
【参考方案2】:您可以使用AWS Athena 并将您的 S3 文件挂载到 athena 并仅向 R 查询选择性记录。下面将详细说明如何使用 athena 运行 r。
https://aws.amazon.com/blogs/big-data/running-r-on-amazon-athena/
希望对你有帮助。
【讨论】:
【参考方案3】:如果您使用 Spark 或类似设备,另一种解决方法是 - 读取/加载 csv 到 DataTable 和 - 继续使用 R Server / sparklyr 处理它
【讨论】:
以上是关于将大型 csv 文件从 S3 读入 R的主要内容,如果未能解决你的问题,请参考以下文章
将大型平面文件读入 r as.numeric 的快速方法 [重复]