Запись данных R как csv непосредственно на s3

Я хотел бы иметь возможность записывать данные непосредственно в ведро в AWS s3 из объекта data.frame\data.table в виде файла csv, не записывая его на диск сначала с помощью AWS CLI.

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? возможно?

Ответ 1

Самое простое решение - просто сохранить CSV в tempfile(), который будет удален автоматически при закрытии сеанса R.

Если вам нужно работать только в памяти, вы можете сделать это, выполнив write.csv() в rawConnection:

# 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")))

Ответ 2

Конечно, но "сохранение в файл" требует, чтобы ваша ОС увидела желаемый целевой каталог в качестве доступной файловой системы. Поэтому, по сути, вам просто нужно установить S3. Вот быстрый поиск Google для этой темы.

Альтернативой является запись во временный файл, а затем использование того, что вы используете для передачи файлов. Вы можете кодировать обе операции как простую вспомогательную функцию.

Ответ 3

В aws.s3 0.2.2 добавлены функции s3write_using()s3read_using()).

Они делают вещи намного проще:

s3write_using(iris, FUN = write.csv,
                    bucket = "bucketname",
                    object = "objectname")