2013-05-06 36 views
11

Tôi tự hỏi nếu có bất kỳ cách nào để tải dữ liệu CSV vào một định dạng nhị phân Hive - tức là làm giống như tải dữ liệu trong cơ sở dữ liệu quan hệ sẽ làm: phân tích cú pháp và nhập chuyển đổi đầu vào và lưu trữ nó ở định dạng nhị phân một tệp nhị phân khác trong trường hợp Hive). Tham chiếu Hive nói rằng lệnh load data inpath không thực hiện "bất kỳ phép chuyển đổi nào" vì vậy tôi nghi ngờ rằng các loại không được chuyển đổi, ví dụ: từ chuỗi thành số nguyên. Tôi đã đọc về các định dạng OCR và RCFile nhưng tôi không thể tìm hiểu xem liệu các giá trị chuỗi từ CSV có được chuyển đổi thành các giá trị số nguyên máy và được lưu trữ trong HDFS hay không. Đó là trường hợp? Có khả năng nào khác để tạo ra các biểu diễn nhị phân của các tệp CSV trong Hive?Có cách nào để tải dữ liệu CSV thành định dạng Hive "nhị phân" không?

Trên ghi chú liên quan: Tôi nghi ngờ Hive chuyển đổi giá trị chuỗi thành biểu diễn máy trong quá trình xử lý truy vấn và không, ví dụ: so sánh giá trị chuỗi - giả định này có đúng không?

Trả lời

21

Theo mặc định, Hive chỉ lưu trữ tệp dưới dạng tệp văn bản thuần túy và lưu trữ các bản ghi dưới dạng văn bản thuần túy, tất cả đều không nén. Nó sử dụng ASCII 0x1 cho một dấu phân cách trường thuận tiện hơn dấu phẩy cho một số đầu vào, nhưng tôi chắc chắn bạn đã tìm ra cách để Hive hoạt động với các giá trị được phân tách bằng dấu phẩy. Nếu bạn muốn Hive sử dụng một định dạng tệp khác, hãy tuần tự hóa/deserialize một cách khác nhau hoặc nén dữ liệu bạn có một vài tùy chọn khác nhau để phát xung quanh.

Hết hộp, Hive hỗ trợ nhiều định dạng tệp khác nhau: TEXTFILE, SEQUENCEFILERCFILE. Sự khác biệt giữa việc phải làm với các tệp được đọc, chia nhỏ và viết như thế nào. TEXTFILE là mặc định và hoạt động trên các tệp văn bản thông thường. SEQUENCEFILE là định dạng cặp khóa-giá trị nhị phân dễ tiêu thụ bởi các phần khác của hệ sinh thái Hadoop. Và RCFILE là một cách định hướng cột để lưu bảng Hive. Ngoài các định dạng tệp này, bạn có thể viết các định dạng của riêng bạn hoặc tìm những người khác đã viết để đáp ứng các nhu cầu khác nhau.

Ngoài định dạng tệp mà dữ liệu của bạn được lưu vào, bạn có thể quyết định cách các bản ghi trong bảng nên được tuần tự hóa và deserialized bằng cách chỉ định một SerDe. Hive 0.9.1 trở lên được đóng gói với AvroSerDe và Avro lưu dữ liệu ở định dạng nhị phân (nó cũng có một lược đồ tự giới thiệu một số biến chứng). Tìm kiếm của Google cho "hive binary SerDe" đã tiết lộ một số LazyBinarySerde có vẻ giống như một cách tiết kiệm đơn giản hơn ở định dạng nhị phân. Và nếu bạn không thể tìm thấy bất cứ điều gì để phù hợp với nhu cầu của bạn, bạn luôn có thể viết SerDe của riêng bạn.

Tôi hình dung câu hỏi của bạn phù hợp với bối cảnh lớn về cách làm cho bảng Hive nhỏ hơn và/hoặc nhiều hơn. Để kết thúc này, bạn có thể áp dụng nén trên đầu trang của tất cả mọi thứ mà tôi đã đề cập ở trên. Để thực hiện điều này chỉ đơn giản nói với Hive để nén nó ra và nói với nó mà codec để nén sử dụng các lệnh sau:

hive> set hive.exec.compress.output=true; 
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec 

Bạn có thể thay đổi điều này trong các tập tin cấu hình của bạn nếu bạn muốn những thiết để tồn tại bên ngoài phiên (bao gồm cả khác công việc của người dân Hive và MapReduce nếu bạn đang chia sẻ một cụm). Tôi sử dụng SnappyCodec vì nó hoạt động với Hive ra khỏi hộp, có thể chia nhỏ, và cho phép nén/giải nén tốt cho thời gian CPU đã sử dụng. Bạn có thể quyết định một codec khác phù hợp hơn với nhu cầu của bạn.

Bây giờ, làm cách nào để bạn áp dụng tất cả các tùy chọn này nếu tất cả dữ liệu của bạn ở định dạng CSV? Cách dễ nhất là tạo bảng trên đầu tệp CSV, sau đó tạo một bảng khác với tệp định dạng và SerDe bạn muốn, sau đó chèn dữ liệu từ bảng được sao lưu CSV vào bảng mới (đảm bảo rằng bạn đang nén đầu ra Hive của mình với codec của bạn lựa chọn). Dưới mui xe, Hive sẽ chăm sóc đọc dữ liệu từ một định dạng (CSV) và viết cho một định dạng khác (bất kể bạn đã quyết định). Sau này, bạn sẽ có một bản sao của dữ liệu và bạn có thể thả các tệp CSV nếu bạn muốn.

CREATE EXTERNAL TABLE csv_table (id INT, name STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," 
LOCATION /user/muehlbau/yourData; 

CREATE TABLE binary_table (id INT, name STRING) 
ROW FORMAT SERDE org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe 
STORED AS SEQUENCEFILE; 

set hive.exec.compress.output=true; 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec 

INSERT OVERWRITE TABLE binary_table 
SELECT * FROM csv_table 

Ví dụ trên minh họa cách bạn có thể tận dụng tất cả các tùy chọn có sẵn cho bạn, nhưng đừng coi đó là trường hợp sử dụng hợp lý, mặc định. Đọc trên các định dạng tệp khác nhau/SerDes/codec nén và thực hiện một số thử nghiệm hiệu suất để giải quyết theo cách tiếp cận của bạn.

+0

Cảm ơn bạn đã mô tả chi tiết! – muehlbau

+0

câu trả lời tuyệt vời! +1 – davek

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