Запись данных 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")