从R将表写入SAP HANA的有效方法

问题描述 投票:1回答:1

我有一个大约50,000行和12列的表(df)写入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');

有没有人遇到过这个挑战,如果有的话,你是否找到了绕过它并提高写作效率的方法?

sql r sap rjdbc
1个回答
0
投票

我会把这个留给后人:

虽然dbGetQuery是大型表的干净解决方案 - 它执行查询然后在每次插入后清除结果集,它也很慢。

显然,从SQL编辑器发送到SAP HANA的多个INSERTs成功但从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()不适用于大型表(它会引发内存限制错误)。可以通过修改Xmx Java选项来增加内存分配池来规避此限制,例如:options(java.parameters="- Xmx5000m")。使用它会带来自己的危险,特别是如果你的目标是自动编写越来越大的表。

我们探索的另一个可能的解决方案是将R输出导出为.csv(或者在超过100万行的情况下输出多个.csvs),然后发送查询以将.csvs导入SAP HANA。大型csvs可以非常快速地导入SAP HANA,但是此解决方案需要额外的步骤(中间.csv输出),并且更容易导致错误的数据导入。

© www.soinside.com 2019 - 2024. All rights reserved.