2013-06-11 30 views
8
  • Tôi có một bảng .csv (t1) với các cột: c1, c2, c3 trong lưu trữ amazon S3
  • Tôi muốn sao chép đó vào amazon dịch chuyển đỏ
  • tôi tạo ra các bảng với các cột: c1, c2, c3 nơi tất cả các cột là nullable
  • sao chép với lệnh:trong postgresql dịch chuyển đỏ tôi có thể bỏ qua các cột với các chức năng sao chép

    bản sao T1A (c1, c3) từ t1

  • Tôi mong đợi nó sẽ sao chép c1 và c3 trên từ t1 và đặt giá trị null mặc định trong c2 để một hàng trong t1a có thể trông giống như (c1_rowX, null, c3_rowX).

  • Thay vào đó tôi nhận được lỗi loại vì nó đối phó với dữ liệu c2 (loại chuỗi) từ t1 thành c3 (loại int) của t1a.

  • lệnh copy hoạt động tốt khi tôi không chỉ định các cột:

    bản sao T1A từ t1

  • tôi đã bao gồm một liên kết đến tài liệu dịch chuyển đỏ lệnh copy:

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

  • m ain câu hỏi là có một vấn đề với việc sử dụng của tôi chỉ định cột. thanks

Trả lời

4

Ánh xạ cột chi tiết không được hỗ trợ trong trực tiếp COPY, trừ khi Amazon/ParAccel bổ sung thêm thứ gì đó vào ngã ba PostgreSQL không nằm trong đường chính.

Những gì bạn thường làm trong trường hợp này là có tập lệnh massage/pad dữ liệu - đọc CSV, chuyển đổi theo mong muốn, sau đó gửi dòng thông qua kết nối PostgreSQL đến lệnh COPY ... FROM STDIN.

Cách khác, bạn có thể COPY toàn bộ CSV gốc vào bảng rồi chuyển dữ liệu đó thành INSERT INTO ... SELECT thành bảng đích thực.

+0

cảm ơn, Craig. Hy vọng tránh sao chép toàn bộ tập tin do kích thước và thời gian. Có thể chuyển đổi trước khi sao chép. – Elm

+0

amazon cung cấp mẫu tập lệnh sao chép: tên bảng COPY [(cột1 [, cột2, ...])] - nơi (cột1 [, cột2, ...]) "chỉ định danh sách cột tùy chọn để tải trường dữ liệu vào các cột cụ thể" – Elm

+0

@Elm Chắc chắn, nhưng điều đó không cho phép bạn nói 'taby name COPY (col1, SKIP, col3)' hiện nó ... và đó là những gì bạn muốn?Ngay cả khi Pg hỗ trợ rằng nó vẫn phải chuyển tất cả dữ liệu để loại bỏ các phần bạn không muốn, do đó, nó có ý nghĩa hơn rất nhiều để chỉ làm điều này phía máy khách với một kịch bản tiền xử lý. –

10

Nếu bạn muốn bỏ qua một phần tiền xử lý, bạn có thể xác định các cột để được bỏ qua như CHAR(1) và sau đó sử dụng một tham số TRUNCATECOLUMNS cho một lệnh COPY:

CREATE TABLE t1a (
    c1, 
    c2 CHAR(1), 
    c3 
); 
COPY t1a FROM t1 TRUNCATECOLUMNS 

Các TRUNCATECOLUMNS bỏ qua tất cả dữ liệu đó là dài hơn định nghĩa trong lược đồ bảng trong quá trình nhập, vì vậy, tất cả dữ liệu trong cột đó sẽ được cắt ngắn thành 1 ký tự.

Đó chỉ là một tập tin đầu vào đã được xử lý trước, được đề xuất, nhưng đôi khi việc hack là tất cả những gì cần thiết.

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