从R

时间:2018-11-29 11:32:21

标签: sql r sap rjdbc

我有一个约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');

有人遇到过这个挑战吗?如果是,您是否找到一种方法来规避它并提高写作效率?

1 个答案:

答案 0 :(得分:0)

为了后代,我将其留在这里

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

显然,从SQL编辑器发送多个到SAP HANA的INSERT是成功的,但是从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(或在行数超过一百万的情况下,将多个.csv导出),然后将查询发送到将.csv导入SAP HANA。大型csv可以非常快速地导入到SAP HANA,但是此解决方案需要额外的步骤(中间.csv输出),而且更容易出现错误的数据导入。