web-dev-qa-db-ja.com

大きなcsvファイルをS3からRに読み込みます

S3からRまたはRStudioにそれぞれ約1800万行と7列の3GBcsvファイルをロードする必要があります。 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から読み取るために大きなファイルを処理する方法に関する他の提案はありますか?

9
Ryan

AWS Athena を使用して、S3ファイルをathenaにマウントし、選択したレコードのみをRにクエリできます。athenaでrを実行する方法については、以下で詳しく説明します。

https://aws.Amazon.com/blogs/big-data/running-r-on-Amazon-athena/

それが役に立てば幸い。

2
Kannaiyan

OPでのHughのコメントに基づいて、s3から通常サイズのcsvをロードしたい人のための回答を追加します

_library(aws.s3)

data <- 
  save_object("s3://myBucketName/directoryName/fileName.csv") %>%
  fread()
_

間違いなく今、そして少なくとも305MBまでのファイルで動作します。

ロードするすべてのcsvのコピーで作業ディレクトリを埋めたくない場合は、これがより適切な代替手段です。

_data <- 
  save_object("s3://myBucketName/directoryName/fileName.csv",
              file = tempfile(fileext = ".csv")
             ) %>%
  fread()
_

また、一時ファイルの配置場所に興味がある場合は、Sys.getenv()で洞察を得ることができます。TMPDIRTEMPまたはTMPを参照してください。詳細については、 Base R tempfile docs。 を参照してください。

0
leerssej

Sparkなどを使用している場合、他の回避策は、-csvをDataTableに読み取り/ロードし、-Rサーバー/ sparklyrで処理を続行することです。

0
Ulrich Beck