2015-08-17 6 views
9

Ich versuche, eine große Datenmenge (10 Cols, 100M Datensätze) schreiben von R nach HANA SAP RJDBC des dbWritetable auf folgende Weise unter Verwendungschreiben zu SAP HANA mit RJDBC mit dbWritetable sehr langsam aufgrund Datensatz für Datensatz einfügen

library("RJDBC") 
drv <- JDBC("com.sap.db.jdbc.Driver", "/data/hdbclient/ngdbc.jar", "'") 
database <- dbConnect(drv,"jdbc:sap://servername", "USER", "PASS") 

dbWriteTable(database, "largeSet", largeSet) 

Dies funktioniert, ist aber extrem langsam (75k Datensätze pro Stunde). Ich habe RODBC (sqlsave) auch getestet und das zeigt das gleiche Problem.

auf den Code Blick hinter dbWriteTable scheint es, dass das Schreiben Datensatz für Datensatz ist (das heißt die gleiche wie Insert in) und in der Tat eine Zeile für Zeile einzufügen Verwendung in dbSendUpdate mit zeigt die gleiche Leistung. Ich habe überprüft, dass das Problem nicht in der Verbindungsgeschwindigkeit selbst liegt.

ROracle hat eine bulk_write Option, die scheint, dieses Problem zu lösen, aber da ich versuche, auf HANA zu schreiben, brauche ich RJDBC oder RODBC.

Kann mir jemand sagen, wie ich den Schreibvorgang auf HANA beschleunigen kann, indem ich einen Bulk-Write oder eine andere Methode ausführe?

+0

Das 'RMySQL' Paket verwendet den' LOAD DATA INFILE' Befehl zum Masseneinsatz Zeilen in der Tabelle. Dies scheint mit "RJDBC" nicht möglich zu sein, aber Sie können Ihre Daten immer in CSV exportieren und manuell in HANA laden oder eine Funktion schreiben, um all diese Schritte für Sie durchzuführen. – daroczig

+0

@daroczig Ja, also bin ich im Wesentlichen auf der Suche nach einer Möglichkeit, RJDBC einen solchen Befehl zu geben (vielleicht durch das Schreiben eines Wrappers basierend auf RMySQL oder Rsqlite). Der CSV-Export/HANA-Import ist etwas, was ich vermeiden möchte, weil es ein unnötiger zusätzlicher Schritt ist und die Leistung ein Problem wird (ich muss 3 Milliarden Datensätze schreiben) – Michiel

+0

Ich bin mir ziemlich sicher, dass du nicht viel Glück mit 'haben wirst JDBC' zum Einfügen großer Datenmengen. Siehe z.B. Diese Benchmarks: https://github.com/szilard/benchm-R-mysql Der CSV-Weg wird viel schneller sein: Ich habe das mit anderen Datenbanken gemacht - gerne teile ich später weitere Details zum Ansatz und der Skript, das bei Interesse für diesen Zweck wiederverwendet werden kann. – daroczig

Antwort

0

Wenn Ihr Hauptziel eine Beschleunigung ist, ohne zu viel zu ändern, könnten Sie zum sjdbc Paket wechseln, das in dieser Hinsicht viel performanter ist als RJDBC (das leider nicht viel Aufmerksamkeit in letzter Zeit erhielt Jahre).

Während ich dies schreibe und auf CRAN zurückblicke, sieht es so aus, als ob Simon gerade erst zurückgefunden hat und erst vor einer Woche ein neues Release veröffentlicht hat. Dies gilt in der Tat gehört eine Verbesserung dbSendUpdate:

https://cran.r-project.org/web/packages/RJDBC/NEWS