Запись в SAP HANA с помощью RJDBC с использованием dbWritetable очень медленная из-за записи путем вставки записи

Я пытаюсь записать большой набор данных (10 столбцов, 100 млн записей) из R в SAP HANA, используя dbWritetable RJDBC следующим образом.

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)

Это работает, но очень медленно (75 тыс. записей в ЧАС). Я также протестировал RODBC (sqlsave), и это показывает ту же проблему.

Глядя на код, стоящий за dbWriteTable, кажется, что запись выполняется запись за записью (то есть так же, как вставка в), и действительно, использование построчной вставки при использовании dbSendUpdate показывает ту же производительность. Я убедился, что проблема не в самой скорости соединения.

У ROracle есть опция bulk_write, которая, кажется, решает эту проблему, но, поскольку я пытаюсь писать в HANA, мне нужен RJDBC или RODBC.

Может ли кто-нибудь сказать мне, как я могу ускорить запись в HANA, запустив массовую запись или какой-либо другой метод?


person Michiel    schedule 17.08.2015    source источник
comment
Пакет RMySQL использует команду LOAD DATA INFILE для массовой вставки строк в таблицу. Это кажется невозможным с RJDBC, но вы всегда можете экспортировать свои данные в CSV и загрузить их в HANA вручную или написать функцию, которая сделает все эти шаги за вас.   -  person daroczig    schedule 22.08.2015
comment
@daroczig Да, поэтому я, по сути, ищу способ заставить RJDBC использовать такую ​​команду (возможно, написав оболочку на основе RMySQL или Rsqlite). Я хочу избежать экспорта CSV/импорта HANA, потому что это ненужный дополнительный шаг, и производительность будет проблемой (мне нужно написать 3 миллиарда записей)   -  person Michiel    schedule 22.08.2015
comment
Я почти уверен, что вам не повезет с JDBC для вставки большого количества данных. См., например. эти тесты: github.com/szilard/benchm-R-mysql Способ CSV будет быть намного быстрее: я делал это с другими базами данных - рад поделиться некоторыми подробностями о подходе позже и скриптом, который может быть повторно использован для этой цели, если интересно.   -  person daroczig    schedule 22.08.2015
comment
@daroczig Я нашел возможное решение здесь: developer.teradata.com/blog/ulrich/2013/11/, но кажется, что команды setString и setInt специфичны для тераданных, так как я получаю ошибки при попытке сделать это в HANA. Какие-либо предложения?   -  person Michiel    schedule 24.08.2015
comment
Я не могу комментировать производительность решения для блога Teradata, но если вы действительно заботитесь о производительности, вам не обойтись без импорта CSV (или двоичного файла). Решение Teradata использует подготовленные операторы, что является улучшением, но оно по-прежнему будет страдать от значительного падения производительности. HANA с ее столбчатым хранилищем данных просто не любит одиночные вставки.   -  person Bouncner    schedule 23.12.2015


Ответы (1)


Если вашей главной целью является ускорение без особых изменений, вы можете переключиться на пакет sjdbc, который в этом отношении гораздо более эффективен, чем RJDBC (который, к сожалению, не привлекал особого внимания в последние годы).

Пока я пишу это и заглядываю в CRAN, похоже, что Саймон только недавно нашел его и опубликовал новую версию всего неделю назад. На самом деле это включает улучшение dbSendUpdate:

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

person RolandASc    schedule 01.02.2018