Mặc dù có thể sử dụng INSERT OVERWRITE
để lấy dữ liệu ra khỏi Hive, nhưng nó có thể không phải là phương pháp tốt nhất cho trường hợp cụ thể của bạn. Đầu tiên hãy để tôi giải thích những gì INSERT OVERWRITE
làm được, sau đó tôi sẽ mô tả phương pháp tôi sử dụng để lấy tệp tsv từ bảng Hive.
Theo hướng dẫn , truy vấn của bạn sẽ lưu trữ dữ liệu trong một thư mục trong HDFS. Định dạng sẽ không phải là csv.
Dữ liệu được ghi vào hệ thống tệp được tuần tự hóa dưới dạng văn bản với các cột được phân tách bằng ^ A và các hàng được phân tách bằng dòng mới. Nếu bất kỳ cột nào không thuộc kiểu nguyên thủy, thì các cột đó được tuần tự hóa thành định dạng JSON.
Một sửa đổi nhỏ (thêm LOCAL
từ khóa) sẽ lưu trữ dữ liệu trong một thư mục cục bộ.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
Khi tôi chạy một truy vấn tương tự, đây là kết quả đầu ra.
[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug 9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE
Cá nhân tôi thường chạy truy vấn của mình trực tiếp thông qua Hive trên dòng lệnh cho loại điều này và chuyển nó vào tệp cục bộ như sau:
hive -e 'select books from table' > /home/lvermeer/temp.tsv
Điều đó cung cấp cho tôi một tệp được phân tách bằng tab mà tôi có thể sử dụng. Hy vọng điều đó cũng hữu ích cho bạn.
Dựa trên bản vá-3682 này , tôi nghi ngờ có giải pháp tốt hơn khi sử dụng Hive 0.11, nhưng tôi không thể tự mình kiểm tra điều này. Cú pháp mới sẽ cho phép những điều sau.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
select books from table;
Hy vọng rằng sẽ giúp.