使用RJDBC将数据帧写入Teradata表

时间:2014-11-05 23:50:59

标签: r teradata rjdbc

按照here的说明建立连接后,我尝试将一个非常简单的数据框(trythis,如下所示)写入名为{{1的数据库中的gh_test_20141105表中。 }}。首先,我试过

p_cia_t

接下来,我在Teradata中创建了一个空表:

> conn <- getTdConnection(vdm='vivaldi') > dbWriteTable(conn=conn,name=tbl,value=trythis) Error in .verify.JDBC.result(s, "Unable to execute JDBC prepared statement ", : Unable to execute JDBC prepared statement INSERT INTO p_cia_t.gh_test_20141005 VALUES(?,?,?,?) ([Teradata Database] [TeraJDBC 14.10.00.17] [Error 3932] [SQLState 25000] Only an ET or null statement is legal after a DDL Statement.)

我接下来的两次尝试编写此数据框的方式都是相互矛盾的:

create table p_cia_t.gh_test_20141105 (eenie integer, meenie integer, minie integer, moe integer);

为什么 > dbWriteTable(conn=conn,name=tbl,value=trythis,append=T) Error in .local(conn, statement, ...) : execute JDBC update query failed in dbSendUpdate ([Teradata Database] [TeraJDBC 14.10.00.17] [Error 3803] [SQLState 42S01] Table 'gh_test_20141105' already exists.) > dbWriteTable(conn=conn,name=tbl,value=trythis,append=T,overwrite=F) Error in .local(conn, name, value, ...) : Cannot append to a non-existing table `p_cia_t.gh_test_20141105' > trythis eenie meenie minie moe 1 1 4 7 10 2 2 5 8 11 3 3 6 9 12 > conn An object of class "JDBCConnection" Slot "jc": [1] "Java-Object{com.teradata.jdbc.jdk6.JDK6_SQL_Connection@2f242b11}" Slot "identifier.quote": [1] NA > tbl [1] "p_cia_t.gh_test_20141105" 会反对表已经存在,以及添加append=T如何将异议更改为“不存在的表?”没有任何意义。

我非常感谢将数据框成功写入Teradata表的任何工作示例,无论是否存在,无论是否附加。

overwrite=F

1 个答案:

答案 0 :(得分:4)

我认为这是由于Teradata的JDBC驱动程序中存在错误。正如here所解释的那样,原因是

  

问题是在dbWriteTable中,RJDBC禁用自动提交(和   在最后再次启用它,创建表然后尝试   在同一个事务中插入它。 Firebird不允许   插入在同一事务中创建的表中。

This page似乎提供了一个解决方案,但我认为从根本上说,我们可能需要等到TD修复错误...

我的临时解决方案是转向ODBC(小表)或直接通过system(“fastload < your_fastload_script”)(大表)调用fastload ...