2014-11-05 90 views
5

Sau khi thiết lập kết nối như được giải thích here, tôi đã cố gắng để viết một khung rất đơn giản dữ liệu (trythis, hình dưới đây) vào một bảng gọi là gh_test_20141105 trong một cơ sở dữ liệu được gọi là p_cia_t. Đầu tiên, tôi đã cố gắngViết một khung dữ liệu vào một bảng Teradata sử dụng 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.) 

Tiếp theo, tôi tạo ra một bảng trống trong Teradata:

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

hai nỗ lực tiếp theo của tôi để viết khung dữ liệu này thất bại trong cách trái ngược nhau:

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

Tại sao append=T đối tượng là bảng đã tồn tại và cách thêm overwrite=F thay đổi phản đối thành "không tồn tại bàn?" Không có ý nghĩa gì cả.

Tôi sẽ đánh giá rất cao bất kỳ ví dụ làm việc nào về cách viết thành công khung dữ liệu vào bảng Teradata, cho dù có sẵn hay không, có hoặc không có phụ thêm.

> 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 

Trả lời

3

Tôi nghĩ điều này là do lỗi trong trình điều khiển JDBC của Teradata. Như đã giải thích ở đây (https://groups.yahoo.com/neo/groups/firebird-java/conversations/messages/10951), lý do là

Vấn đề là ở dbWriteTable RJDBC vô hiệu hóa autocommit (và cho phép nó một lần nữa ở cuối), tạo ra bảng và sau đó cố gắng chèn vào nó trong cùng một giao dịch. Firebird không cho phép chèn vào bảng được tạo trong cùng một giao dịch.

Trang này (http://developer.teradata.com/blog/ulrich/2013/11/a-wider-test-case-on-r-jdbc-fastload) dường như cung cấp một giải pháp nhưng tôi nghĩ rằng về cơ bản chúng ta có thể phải chờ cho đến khi TD sửa lỗi ...

giải pháp tạm thời của tôi là để chuyển sang ODBC (bảng nhỏ) hoặc gọi fastload trực tiếp bằng hệ thống (“fastload < your_fastload_script”) (bảng lớn)…

Các vấn đề liên quan