2015-05-13 27 views
9

Tôi biết có vấn đề đã biết với dấu phân tách khi lưu bảng vào csv (hoặc tệp văn bản khác) trong Hive. Vì vậy, tôi tự hỏi nếu các bạn có thể giúp tôi vượt qua điều đó.xuất bảng Hive sang csv trong hdfs

Tôi có bảng hiện có (Bảng A) và tôi muốn lưu nó ở định dạng csv thành hdfs. Từ đọc các câu trả lời khác tôi tin rằng tôi sẽ phải đầu tiên tạo ra một bảng bên ngoài (nhưng tôi không chắc chắn làm thế nào toàn bộ điều sẽ xem xét).

Có ai giúp được không?

+0

Cá nhân, tôi chỉ sử dụng 'chèn thư mục ghi đè' và có tệp phân tách' \ 001'. Nhưng nếu bạn * phải * có một csv, tôi nghĩ rằng bạn tốt nhất ra piping truy vấn đến một địa phương .csv và sau đó 'hadoop fs -put'-ing nó vào hdfs, được mô tả ở đây http://stackoverflow.com/question/18129581/how-do-i-output-the-kết quả-of-a-hiveql-query-to-csv – gobrewers14

+0

Tôi muốn tránh lưu một tệp lớn vào thư mục cục bộ nếu có thể.Vấn đề của tôi là sau đó tôi cần phải tải các tập tin vào R và để làm điều này bạn thường chỉ định một dấu phân cách, không chắc chắn làm thế nào điều này sẽ làm việc (hoặc nếu nó sẽ làm việc) với một nhân vật vô hình. – Laura

+0

Tôi tải dữ liệu từ hdfs để kích hoạt và chỉ định dấu phân tách là '" \ 001 "'. Tôi đã không bao giờ có (một lý do) để nhập một tập tin từ HDFS để R nhưng tôi giả sử nó có thể mất bất kỳ dấu phân cách miễn là nó được chỉ định một cách chính xác. – gobrewers14

Trả lời

9

Hãy thử điều này trong vỏ hive:

INSERT OVERWRITE LOCAL DIRECTORY '/path/to/hive/csv' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM hivetablename; 

Thay đổi của bạn /path/to/csv đến vị trí bạn muốn lưu trữ tập tin csv. hivetablename vào bảng hive của bạn để được lưu trữ ở định dạng csv.

+1

Tôi nghĩ rằng cô ấy muốn nó được lưu trên hdfs, không phải trên fs địa phương. –

1

Đối với bảng bên ngoài trong tổ ong, bạn có thể làm theo các bước dưới đây:

  1. Tạo bảng bên ngoài trong hive

    CREATE EXTERNAL TABLE external_table (số INT, tên STRING) LĨNH VỰC ROW FORMAT phân TERMINATED BY ',' LOCATION '/ người dùng/hive/external/mytable /';

2. Tải file dữ liệu từ địa phương để HDFS vị trí

hadoop fs -put /home/user1/Desktop/filename.csv /user/hive/external/mytable/ 

Hai bước trên có thể giải quyết vấn đề của bạn.

+0

Tôi đang nhập bảng hiện tại mà tôi đã tạo ở đâu? Tôi thấy điều này khi tạo một bảng trống và đặt nó vào thư mục cục bộ. Bạn có thể giải thích thêm? – Laura

+2

VỊ TRÍ '/ người dùng/hive/external/mytable /'; giá trị vị trí là thư mục vị trí HDFS và KHÔNG phải thư mục cục bộ. trong khi di chuyển tệp tức là hadoop fs -put /home/user1/Desktop/filename.csv/người dùng/hive/external/mytable /, nó là từ thư mục cục bộ đến thư mục vị trí HDFS – Farooque

+0

bảng của tôi đã được lưu trữ trong hdfs và có thể được truy cập với đường dẫn/user/hive ... – Laura

2

quá trình bước thứ ba này đã làm việc tốt cho tôi:

  1. trong Hive, tạo ra một bảng tạm thời mới được lưu trữ như textfile

    CREATE TABLE temp_table(id INT, name STRING) 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
    STORED AS TEXTFILE; 
    
  2. cũng trong Hive, viết mã nguồn dữ liệu vào bảng tạm thời

    INSERT OVERWRITE TABLE temp_table 
    SELECT id, name FROM source_table; 
    
  3. Từ dòng lệnh, sao chép bảng Hive từ vị trí của nó trong HDFS cho bạn tập tin địa phương - kiểm tra nên tiết lộ nội dung tập tin csv (đổi tên cho phù hợp nếu muốn)

    hdfs dfs -copyToLocal /apps/hive/warehouse/temp_table/* /tmp/local_dir/ 
    

Nếu bạn chạy lệnh SHOW CREATE TABLE temp_tabletrong HIVE, nó sẽ cho bạn biết vị trí chính xác của bảng trong HDFS, ví dụ

| LOCATION              | 
| 'hdfs://hadoop_cluster/apps/hive/warehouse/temp_table'  | 
Các vấn đề liên quan