web-dev-qa-db-ja.com

Rデータをcsvとしてs3に直接書き込みます

AWS CLIを使用して最初にディスクに書き込むことなく、データをdata.frame\data.tableオブジェクトからcsvファイルとしてAWSs3のバケットに直接書き込むことができるようにしたいと思います。

obj.to.write.s3 <- data.frame(cbind(x1=rnorm(1e6),x2=rnorm(1e6,5,10),x3=rnorm(1e6,20,1)))

現時点では、最初にcsvに書き込み、次に既存のバケットにアップロードしてから、次を使用してファイルを削除します。

fn <- 'new-file-name.csv'
write.csv(obj.to.write.s3,file=fn)
system(paste0('aws s3 ',fn,' s3://my-bucket-name/',fn))
system(paste0('rm ',fn))

S3に直接書き込む関数が欲しいですか?それは可能ですか?

17
h.l.m

_aws.s3 0.2.2_に、s3write_using()(およびs3read_using())関数が追加されました。

それらは物事をはるかに簡単にします:

_s3write_using(iris, FUN = write.csv,
                    bucket = "bucketname",
                    object = "objectname")
_
15
leerssej

最も簡単な解決策は、.csvをtempfile()に保存することです。これは、Rセッションを閉じると自動的に削除されます。

メモリ内でのみ作業する必要がある場合は、rawConnectionに対してwrite.csv()を実行することでこれを行うことができます。

# write to an in-memory raw connection
zz <- rawConnection(raw(0), "r+")
write.csv(iris, zz)

# upload the object to S3
aws.s3::put_object(file = rawConnectionValue(zz),
    bucket = "bucketname", object = "iris.csv")

# close the connection
close(zz)

よくわからない場合は、S3からオブジェクトをダウンロードしてRに読み戻すことで、これが正しく機能したことを確認できます。

# check that it worked
## (option 1: save locally)
save_object(object = "iris.csv", bucket = "bucketname", file = "iris.csv")
read.csv("iris.csv")
## (option 2: keep in memory)
read.csv(text = rawToChar(get_object(object = "iris.csv", bucket = "bucketname")))
5
Thomas

もちろんですが、「ファイルに保存」するには、OSが目的のターゲットディレクトリをアクセス可能なファイルシステムとして認識する必要があります。したがって、本質的には、S3を「ただ」マウントする必要があります。これが グーグルのクイック検索 そのトピックです。

別の方法は、一時ファイルに書き込んでから、ファイルの転送に使用するものを使用することです。両方の操作を単純なヘルパー関数としてコーディングできます。

0