【问题标题】:Write to SAP HANA with RJDBC using dbWritetable very slow due to record by record insert由于逐记录插入,使用 dbWritetable 使用 RJDBC 写入 SAP HANA 非常慢
【发布时间】: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 不喜欢单次插入。

标签: r hana rjdbc


【解决方案1】:

如果您的主要目标是加快速度,而无需进行太多其他更改,您可以切换到 sjdbc 包,在这方面它比 RJDBC 性能要好得多(遗憾的是,它并没有得到太多近几年的关注)。

当我写这篇文章并再次查看 CRAN 时,看起来 Simon 最近才找到它并在一周前发布了一个新版本。这实际上包括对dbSendUpdate 的改进:

https://cran.r-project.org/web/packages/RJDBC/NEWS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2016-07-25
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多