2014-11-05 36 views
5

Po ustanowieniu połączenia, jak wyjaśniono here, starałem się napisać bardzo prosty ramki danych (trythis, pokazany poniżej) do tabeli o nazwie gh_test_20141105 w bazie danych o nazwie p_cia_t. Najpierw próbowałemPisanie ramkę danych do tabeli Teradata przy użyciu 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.) 

Dalej, stworzyłem pusty stolik w Teradata:

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

Moi Kolejne dwie próby, aby napisać tę ramkę danych nie powiodło się w sprzecznych sposobów:

> 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" 

Dlaczego obiekt append=T, że tabela już istnieje, i jak dodać overwrite=F zmienić sprzeciw na "nieistniejące" stół?" Żadne nie ma sensu.

Byłbym bardzo wdzięczny za każdy działający przykład pomyślnego zapisania ramki danych do tabeli Teradata, niezależnie od tego, czy jest już wcześniej, czy nie, z dołączeniem lub bez niego.

> 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 

Odpowiedz

3

Myślę, że jest to spowodowane błędem w sterowniku JDBC firmy Teradata. Jak wyjaśniono tutaj (https://groups.yahoo.com/neo/groups/firebird-java/conversations/messages/10951), powodem jest to, że

Problem polega na tym, że w dbWriteTable RJDBC wyłączenie trybu automatycznego (i pozwala go ponownie na końcu), tworzy tabelę, a następnie próbuje wkładki do niego w ta sama transakcja. Firebird nie zezwala na wstawianie do tabeli utworzonej w tej samej transakcji.

Ta strona (http://developer.teradata.com/blog/ulrich/2013/11/a-wider-test-case-on-r-jdbc-fastload) wydaje się oferować rozwiązania, ale myślę, że zasadniczo może będziemy musieli czekać aż TD naprawia ten błąd ...

Moje rozwiązanie tymczasowe jest, aby włączyć do ODBC (stolik) lub wywołać fastload bezpośrednio przez system ("fastload < your_fastload_script") (duży stół) ...