簡體   English   中英

從S3讀取大型csv文件到R

[英]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 TEMPTMP 可以在Base R tempfile文檔中找到更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM