我有一个约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');
有人遇到过这个挑战吗?如果是,您是否找到一种方法来规避它并提高写作效率?
答案 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
输出),而且更容易出现错误的数据导入。