我需要加载一个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)
现在,由于文件比平时大得多,我收到错误
> csvcharobj <- rawToChar(obj)
Error in rawToChar(obj) : long vectors not supported yet: raw.c:68
阅读this post,我知道向量太长但在这种情况下如何对数据进行子集化?还有其他建议如何处理从S3读取的较大文件?
答案 0 :(得分:2)
您可以使用AWS Athena并将您的S3文件挂载到athena并仅查询选择性记录到R.如何使用athena运行r将在下面详细说明。
https://aws.amazon.com/blogs/big-data/running-r-on-amazon-athena/
希望它有所帮助。
答案 1 :(得分:0)
如果您使用的是Spark或类似产品,则另一种解决方法是 -读取/加载CSV到DataTable和 -继续使用R Server / sparklyr
处理它答案 2 :(得分:0)
最初是基于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
TEMP
或TMP
。可以在the Base R tempfile docs.中找到更多信息。