2014-11-05 2 views
5

설명한대로 연결을 설정 한 후 p_cia_t이라는 데이터베이스에서 gh_test_20141105이라는 테이블에 매우 간단한 데이터 프레임 (trythis, 아래 참조)을 작성하려고했습니다.RJDBC를 사용하여 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" 
첫째, 내가

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

다음을 시도, 나는 테라 데이타의 빈 테이블을 생성

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는 동일한 트랜잭션으로 생성 된 테이블에 삽입을 허용하지 않습니다.

내 임시 방편는 ODBC (작은 테이블) 이상으로 설정하는 것입니다 ...

이 페이지 (http://developer.teradata.com/blog/ulrich/2013/11/a-wider-test-case-on-r-jdbc-fastload)는 솔루션을 제공 할 것으로 보인다 그러나 나는 우리가 TD는 버그가 수정 될 때까지 기다려야 할 수도 근본적으로 생각 빠른로드를 시스템 ("fastload < your_fastload_script") (큰 테이블)에서 직접 호출하십시오 ...

관련 문제