我试图插入3.8M记录到包含14列的Teradata表中,通过使用R的RJDBC
包的一批10000条记录。它总是在插入380,000条记录后崩溃,即在第39批处理执行时。这是我得到的错误,
.jcall误差(ps,"我"、"executeBatch"):
java.sql.BatchUpdateException: [Teradata JDBC Driver] [TeraJDBC . JDBC[Error 1338] [SQLState HY000]在执行PreparedStatement批处理请求时失败。故障详情是否可以在异常链中找到可访问的getNextException .
我已经尝试从同一数据框架更改到不同的行集。并且,行为保持不变,在第39批处理执行时崩溃。
知道这是什么Error 1338
和什么可以修复吗?此外,它提到了getNextException
,但我如何使用它与R?
我使用的方法与此类似https://developer.teradata.com/blog/ulrich/2013/11/a-wider-test-case-on-r-jdbc-fastload
要获得初始异常"对象",您需要使用. jgetex来,然后您可以使用getNextException方法来检索其根本原因。
请参阅teradata开发人员论坛上的链接以获取完整的示例。
批处理插入过程中出现异常的典型原因有:
- "value related":无效值,数值数据精度过高
- "size related":插入的行产生"no more room in database"错误
既然你说你已经测试了不同的数据集,并且它们在同一执行中都失败了,这很可能是"没有更多的空间在数据库"。
但是,这并不一定意味着授予给您的空间已经满了:可能是表的主索引选择不当(或者数据有错误,产生了重复的主索引),从而导致分布非常倾斜。在这种情况下,如果您可以定义一个更合适的主索引(或者使用NOPI表,如果您将其用作某种阶段表),您将浪费大量可以回收的空间。
在这里你可以找到关于"太空垃圾"主题的讨论,其中有许多有用的查询来诊断问题。
同样发生在我身上,我试图插入27.4M记录到包含8列的Teradata表中。我在5.35M行也有同样的错误。
唯一对我有用的是每1M记录提交一次
这里就不多说了
- 第一个是GC。这在通常的java程序中不是问题,但在数百万条记录的负载下,尝试在一秒钟内最终完成
Thread.sleep
。这将触发GC。我在17.00.00.03
版本的Teradata JDBC驱动程序中发现了一些竞争条件。出于性能目的,它重用旧对象,并对要收集的东西进行弱引用。当使用fastload™或multiload™负载时,这变得至关重要。 - 确保数据库中有足够的空间。这也会导致这个异常。