[英]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
TEMP
或TMP
。 可以在Base R tempfile文檔中找到更多信息。 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.