Эффективный способ записи таблицы в SAP HANA из R - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть таблица (df), содержащая около 50 000 строк и 12 столбцов для записи в SAP HANA.Я использую библиотеку RJDBC и пишу построчно следующим образом:

# Returns the sql statement to insert one row
 build_insert_string <- function(db_output, row) {
  row_string <- paste(row, collapse="','")
  statement <- paste('INSERT INTO "', db_output$SCHEMA, '"."',db_output$table_name,'" (',db_output$string_of_columns,') VALUES (\'', row_string, '\');', sep='')
  return(statement)
}

# Insert row by row
for(i in 1:nrow(df)){
    tryCatch({ dbGetQuery(jdbcConnection, build_insert_string(db_output, df[i,])) }, error = function(e) {handle_db_errors(e)})
  }

, где db_output - список, содержащий выходные константы (схема, таблица и столбцы).

В настоящее времяДля написания таблицы требуется почти половина дня.Похоже, что HANA не поддерживает пакетные вставки, такие как:

INSERT INTO example
  (example_id, name, value, other_value)
VALUES
  (100, 'Name 1', 'Value 1', 'Other 1'),
  (101, 'Name 2', 'Value 2', 'Other 2'),
  (102, 'Name 3', 'Value 3', 'Other 3'),
  (103, 'Name 4', 'Value 4', 'Other 4');

Кто-нибудь сталкивался с этой проблемой, и если да, нашли ли вы способ обойти ее и повысить эффективность записи?

1 Ответ

0 голосов
/ 10 декабря 2018

Я оставлю это здесь для потомков:

Хотя dbGetQuery является чистым решением для больших таблиц - он выполняет запрос, а затем очищает набор результатов после каждой вставки, но он также медленный.

По-видимому, несколько INSERT в SAP HANA успешно выполняются при отправке из редактора SQL, но не при отправке из R.

(действительно) быстрое решение будет обеспечиваться:

dbWriteTable (
conn = jdbcConnection,
name= paste0(db_output$SCHEMA, ".",db_output$table_name),
value = df,
row.names = FALSE,
field.types = db_output$string_of_columns, 
append=TRUE
)

Однако, dbWriteTable() не предназначен для больших таблиц (он выдаст ошибку ограничения памяти).Это ограничение можно обойти, увеличив пул выделения памяти, изменив параметр Java Xmx, например: options(java.parameters="- Xmx5000m").Используйте его на свой страх и риск, особенно если вы стремитесь автоматизировать написание все более больших таблиц.

Еще одно потенциальное решение, которое мы исследовали, - экспортировать вывод R как .csv (или несколько .csv s).в случае более 1 миллиона строк), а затем отправьте запрос на импорт .csv s в SAP HANA.Большие csv s очень быстро импортируются в SAP HANA, но это решение требует дополнительного шага (промежуточный вывод .csv) и более подвержено некорректному импорту данных.

...