2016-05-25 8 views
4

erstellen ich CSV-Dateien von S3 mit fread aus dem data.table Paket wie diese lesen möchte: irgendwoWie ein signiertes S3 url

ulr_with_signature <- signURL(url, access_key, secret_key) 
DT <- fread(ulr_with_signature) 

Gibt es ein Paket oder ein Stück Code, der mir erlaubt zu bauen URL mit Zugriff/Geheimschlüsselpaar.

Ich möchte awscli nicht zum Lesen der Daten verwenden.

+0

Hier ist eine Frage zum Schreiben von Daten direkt auf S3 mit Antwort beim Lesen in den Speicher auch: http://stackoverflow.com/questions/30084595/write-r-data-as-csv-directly-to-s3 – Bulat

Antwort

6

können Sie verwenden die AWS S3 package:

Ihre Lese auszuführen:

# These variables should be set in your environment, but you could set them in R: 
Sys.setenv("AWS_ACCESS_KEY_ID" = "mykey", 
     "AWS_SECRET_ACCESS_KEY" = "mysecretkey", 
     "AWS_DEFAULT_REGION" = "us-east-1") 

library("aws.s3") 

Wenn Sie ein R-Objekt haben obj Sie AWS speichern möchten, und später lesen:

s3save(obj, bucket = "my_bucket", object = "object") 
# and then later 
obj <- s3load("object", bucket = "my_bucket") 

Offensichtlich ersetzen Sie den Bucket-Namen und den Dateinamen (den Namen des Objekts im AWS-Bucket) für echte Werte. Das Paket hat auch eine entsprechende s3save Funktion. Sie können auch im RDS-Format mit s3saveRDS und s3readRDS speichern und laden.

Wenn Sie eine Textdatei lesen müssen, dann ist es etwas komplizierter, da die Funktion ‚get_object‘ Bibliothek einen rohen Vektor zurückgibt, und wir haben es uns selbst zu analysieren:

raw_data <- get_object('data.csv', 'my_bucket') 

# this method to parse the data is copied from the httr library 
# substitute encoding from as needed 
data <- iconv(readBin(raw_data, character()), from="UTF-8", to="UTF-8") 

# now the data can be read by any R function, eg. 
read.csv(data) 
fread(data) 

# All this can be done without temporary objects: 
fread(iconv(
    readBin(get_object('data.csv', 'my_bucket'), character()), 
    from="UTF-8", to="UTF-8")) 

Ihre Vorstellung von einem 'signierte URL' ist nicht verfügbar, soweit ich weiß. Ein Vorbehalt, sollten Sie versuchen, eine solche Lösung zu entwickeln: Es ist wichtig, an die Sicherheitsimplikationen zu denken, die sich aus der Speicherung Ihres geheimen Zugriffsschlüssels im Quellcode ergeben.

Eine andere Sorge über die 'signierte URL' ist, dass das Objekt im Speicher gespeichert werden würde. Wenn der Arbeitsbereich gespeichert wird, wird er auf der Festplatte gespeichert. Eine solche Lösung müsste die Sicherheit sorgfältig überprüfen.

+1

Entschuldigung - drücken Sie die Eingabetaste zu früh. Sie sind besorgt, dass dies eine temporäre Datei erstellt? Aha. Soweit ich das aus dem Code ersehen kann, erzeugt dies keine temporäre Datei, aber ich könnte mich irren. 's3load' ruft' get_object' (keine Dateierstellung hier) auf, 'get_object' ruft' s3HTTP' auf, immer noch ohne lokale Dateien, und diese Funktion ruft die Methode GET aus dem Paket 'httr' auf. Ich kann 'awscli' nirgends sehen. – sigvei

+0

Und um meinen ersten Beitrag zu klären: "Dateiname" ist kein lokaler Dateiname. Es ist der Dateiname der Datei _in der Cloud_, dh. der Name der S3-Datei. – sigvei

+0

Ok, ich denke wir kommen dort hin. Ich denke, 'fread (url)' 'könnte ich' signature_v2_auth' oder 'signature_v4_auth' aus dem aws.signature-Paket verwenden? - https://cran.r-project.org/web/packages/aws.signature/aws.signature.pdf – Bulat

Verwandte Themen