2014-11-05 47 views
5

建立连接所解释here之后Teradata表,我试图写一个非常简单的数据帧(trythis,如下所示)的表在一个名为p_cia_t数据库称为gh_test_20141105。首先,我想写数据帧使用RJDBC

> 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.) 

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

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{[email protected]}" 

Slot "identifier.quote": 
[1] NA 

> tbl 
[1] "p_cia_t.gh_test_20141105" 

为什么append=T反对一个表已经存在,以及如何添加overwrite=F将异议更改为“不存在表?”没有任何意义。

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

> sessionInfo() 
R version 3.1.2 (2014-10-31) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RJDBC_0.2-4  rJava_0.9-6  DBI_0.3.1  dplyr_0.3.0.2 scales_0.2.4  ggplot2_1.0.0 reshape2_1.4  
[8] RODBC_1.3-10  data.table_1.9.4 

loaded via a namespace (and not attached): 
[1] assertthat_0.1 chron_2.3-45  colorspace_1.2-4 digest_0.6.4  grid_3.1.2  gtable_0.1.2  magrittr_1.0.1 
[8] MASS_7.3-35  munsell_0.4.2 parallel_3.1.2 plyr_1.8.1  proto_0.3-10  Rcpp_0.11.3  stringr_0.6.2 
[15] tools_3.1.2 

回答

3

我认为这是由于Teradata的JDBC驱动程序中的一个错误。由于这里解释(https://groups.yahoo.com/neo/groups/firebird-java/conversations/messages/10951),原因是

的问题是,在dbWriteTable RJDBC禁用自动提交(和 再次使其在年底),创建表,然后尝试 插入到它的同样的交易。 Firebird不允许 插入到在同一事务中创建的表中。

此页面(http://developer.teradata.com/blog/ulrich/2013/11/a-wider-test-case-on-r-jdbc-fastload)似乎提供了一个解决方案,但我认为,从根本上,我们可能要等到TD修复了这个bug ......

我的临时解决方法是求助于ODBC(小表)或通过系统直接呼叫fastload(“fastload < your_fastload_script”)(big table)...