Pytanie Zapisz dane R jako csv bezpośrednio do s3


Chciałbym móc zapisywać dane bezpośrednio do wiadra w AWS s3 z a data.frame\ data.table obiekt jako plik csv bez uprzedniego zapisania go na dysk przy użyciu interfejsu wiersza poleceń AWS.

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

w tej chwili najpierw piszę do csv, a następnie przesyłam do istniejącego wiadra, a następnie usuwam plik za pomocą:

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

Chciałbym funkcji, która pisze bezpośrednio do s3? czy to jest możliwe?


11
2018-05-06 18:17


pochodzenie




Odpowiedzi:


Najprostszym rozwiązaniem jest tylko zapisanie pliku .csv w tempfile(), który zostanie automatycznie usunięty po zamknięciu sesji R.

Jeśli potrzebujesz pracować tylko w pamięci, możesz to zrobić wykonując write.csv() do połączenia 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)

Jeśli nie masz pewności, możesz sprawdzić, czy to działało poprawnie, pobierając obiekt z S3 i czytając go z powrotem do 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
2018-05-23 19:43





W aws.s3 0.2.2  s3write_using() (i s3read_using()) zostały dodane funkcje.

Sprawiają, że rzeczy są znacznie prostsze:

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

4
2017-10-12 00:09





Oczywiście - ale "zapisywanie do pliku" wymaga, aby twój system operacyjny widział pożądany katalog docelowy jako dostępny system plików. Więc w zasadzie "wystarczy" zamontować S3. Tutaj jest szybkie wyszukiwanie w Google dla tego tematu.

Alternatywą jest zapis do pliku tymczasowego, a następnie użycie tego, czego używasz do przesyłania plików. Można zakodować obie operacje jako prostą funkcję pomocniczą.


0
2018-05-06 18:22