我有一个大约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');
有没有人遇到过这个挑战,如果有的话,你是否找到了绕过它并提高写作效率的方法?
我会把这个留给后人:
虽然dbGetQuery
是大型表的干净解决方案 - 它执行查询然后在每次插入后清除结果集,它也很慢。
显然,从SQL编辑器发送到SAP HANA的多个INSERT
s成功但从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万行的情况下输出多个.csv
s),然后发送查询以将.csv
s导入SAP HANA
。大型csv
s可以非常快速地导入SAP HANA,但是此解决方案需要额外的步骤(中间.csv
输出),并且更容易导致错误的数据导入。