我正在尝试使用 R 的
RJDBC
包通过一批 10000 条记录将 380 万条记录插入到包含 14 列的 Teradata 表中。
它总是在插入 380000 条记录后崩溃,即在第 39 批执行时。
这是我得到的错误,
.jcall(ps, "[I", "executeBatch") 中的错误:
java.sql.BatchUpdateException:[Teradata JDBC 驱动程序] [TeraJDBC 15.10.00.22] [错误 1338] [SQLState HY000] 执行PreparedStatement 批处理请求时发生故障。失败的详细信息 可以在可访问的异常链中找到 获取下一个异常。
我尝试更改为同一数据帧中的一组不同的行。并且,行为保持不变,在第 39 批执行时崩溃。
知道这是什么
Error 1338
以及可以解决什么问题吗?
另外,它提到了 getNextException
但我如何将它与 R 一起使用?
我使用的方法与此类似 https://developer.teradata.com/blog/ulrich/2013/11/a-wider-test-case-on-r-jdbc-fastload
要获取初始异常“对象”,您需要使用 .jgetEx 来获取,然后可以使用其 getNextException 方法来检索根本原因。
请参阅 teradata 开发者论坛上的此链接,了解完整示例。
批量插入过程中出现异常的典型原因是:
既然您说您已经测试了不同的数据集,并且它们在同一执行中都失败了,那么这很可能是“数据库中没有更多空间”。
但是,这并不一定意味着分配给您的空间已满:可能是表的主索引选择不当(或者数据存在错误,产生重复的主索引) ,导致分布非常偏斜。在这种情况下,如果您可以定义更合适的主索引(或者使用 NOPI 表,如果您将其用作某种阶段表),您将浪费大量可以回收的空间。
在这里您可以找到有关“空间浪费”主题的讨论,其中包含许多有用的查询来诊断问题。
同样的情况也发生在我身上,我试图将 2740 万条记录插入到包含 8 列的 Teradata 表中。我在 5.35M 行时遇到同样的错误。
唯一对我有用的是每 1M 条记录进行一次提交。
这里的注释很少。
Thread.sleep
。这将触发GC。我在 Teradata JDBC 驱动程序版本 17.00.00.03
中发现了一些竞争条件。出于性能目的,它重用旧对象,并弱引用要收集的内容。当使用 fastload™ 或 multiload™ 负载时,这一点变得至关重要。