【发布时间】:2015-11-10 06:30:23
【问题描述】:
我正在尝试使用 RJDBC 的 dbWritetable 按以下方式将大型数据集(10 列,100M 记录)从 R 写入 SAP HANA
library("RJDBC")
drv <- JDBC("com.sap.db.jdbc.Driver", "/data/hdbclient/ngdbc.jar", "'")
database <- dbConnect( drv,"jdbc:sap://servername", "USER", "PASS")
dbWriteTable(database, "largeSet", largeSet)
这可行,但速度极慢(每小时 75k 条记录)。我也测试了 RODBC (sqlsave),这显示了同样的问题。
查看dbWriteTable 背后的代码,似乎写入是逐条记录(即与插入相同),并且确实使用dbSendUpdate 逐行插入显示了相同的性能。我已经验证问题不在于连接速度本身。
ROracle 有一个bulk_write 选项,似乎可以解决这个问题,但由于我正在尝试写入 HANA,因此我需要 RJDBC 或 RODBC。
谁能告诉我如何通过运行批量写入或其他方法来加快对 HANA 的写入速度?
【问题讨论】:
-
RMySQL包使用LOAD DATA INFILE命令在表中批量插入行。RJDBC似乎无法做到这一点,但您始终可以将数据导出到 CSV 并手动将其加载到 HANA,或者编写一个函数来为您完成所有这些步骤。 -
@daroczig 是的,所以我本质上是在寻找一种方法让 RJDBC 使用这样的命令(也许通过编写基于 RMySQL 或 Rsqlite 的包装器)。 CSV 导出/HANA 导入是我想避免的,因为这是不必要的额外步骤,而且性能会成为问题(我需要写入 30 亿条记录)
-
我很确定你不会因为
JDBC插入大量数据而感到幸运。参见例如这些基准测试:github.com/szilard/benchm-R-mysql CSV 方式会快得多:我一直在使用其他数据库进行此操作——很高兴稍后分享有关该方法和脚本的更多细节,如果有兴趣,可能会为此目的重复使用. -
@daroczig 我在这里找到了一个可能的解决方案:developer.teradata.com/blog/ulrich/2013/11/… 但似乎 setString 和 setInt 命令是 teradata 特定的,因为我在 HANA 上尝试此操作时遇到错误。有什么建议吗?
-
我无法评论 Teradata 博客解决方案的性能,但如果您真的关心性能,那么 CSV(或二进制)导入是没有办法的。 Teradata 解决方案使用预准备语句,这是一种改进,但仍会严重影响性能。具有列式数据存储的 HANA 不喜欢单次插入。