2012-10-30 59 views
8

Tôi có tệp nhật ký trong HDFS, các giá trị được phân tách bằng dấu phẩy. Ví dụ:Tải trọng trong bảng được phân đoạn

2012-10-11 12:00,opened_browser,userid111,deviceid222

Bây giờ tôi muốn tải tập tin này để Hive bảng trong đó có cột "dấu thời gian", "hành động" và phân chia bởi "userid", "deviceid". Làm thế nào tôi có thể yêu cầu Hive lấy 2 cột cuối cùng trong tệp nhật ký làm phân vùng cho bảng? Tất cả các ví dụ e.g. "hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');" yêu cầu định nghĩa phân vùng trong tập lệnh, nhưng tôi muốn phân vùng được thiết lập tự động từ tệp HDFS.

Một giải pháp là tạo bảng không phân đoạn trung gian với tất cả 4 cột, điền nó từ tệp và sau đó tạo INSERT into first_table PARTITION (userid,deviceid) select from intermediate_table timestamp,action,userid,deviceid; nhưng đó là nhiệm vụ bổ sung và chúng tôi sẽ có 2 bảng rất giống nhau. bảng bên ngoài là trung gian.

Trả lời

12

Ning Zhang có phản hồi tuyệt vời về chủ đề tại http://grokbase.com/t/hive/user/114frbfg0y/can-i-use-hive-dynamic-partition-while-loading-data-into-tables.

Bối cảnh nhanh chóng là:

  1. dữ liệu tải chỉ đơn giản là bản sao dữ liệu, nó không đọc nó để nó không thể tìm ra những gì để phân vùng
  2. sẽ đề nghị bạn tải dữ liệu vào một bảng trung gian đầu tiên (hoặc sử dụng một bảng bên ngoài trỏ đến tất cả các tệp) và sau đó cho phép chèn động phân vùng để kick vào để tải nó vào một bảng được phân đoạn
+0

Cảm ơn, Denny. Đó là cách tôi đã giải quyết vấn đề này - sử dụng bảng bên ngoài trỏ đến tệp thô và sau đó dữ liệu từ nó được chèn vào bảng được phân đoạn với các phân vùng đã chọn. Đây là giải pháp đơn giản duy nhất của trường hợp này. –

+0

Thứ thú vị - vui vì nó đã hoạt động, eh ?! –

+0

Vâng, đó là một phép thuật :) Tôi đã giải quyết nó cùng một lúc khi bạn thêm bình luận của bạn :) Có lẽ bạn có thể giúp tôi với một vấn đề khác? http://stackoverflow.com/questions/13240409/hadoop-eof-exception-after-map-step –

1

Tôi đã làm việc cùng một kịch bản này, nhưng thay vào đó, những gì chúng tôi đã làm là tạo riêng biệt Tệp dữ liệu HDFS cho mỗi phân vùng bạn cần tải.

Vì dữ liệu của chúng tôi đến từ một công việc MapReduce, chúng tôi đã sử dụng MultipleOutputs trong lớp Reducer để ghép dữ liệu vào tệp phân vùng tương ứng của chúng. Sau đó, nó chỉ là vấn đề xây dựng kịch bản bằng cách sử dụng Phân vùng từ tên tệp HDFS.

0
  1. Như đã đề cập trong câu trả lời @Denny Lee, chúng ta cần phải liên quan đến một bảng dàn (invites_stg) quản lý hoặc bên ngoài và sau đó chèn từ bảng dàn bảng phân vùng (mời trong trường hợp này).

  2. Hãy chắc chắn rằng chúng tôi có hai thuộc tính này thiết lập để: SET hive.exec.dynamoc.partition = true SET hive.exec.dynamic.partition.mode = nonstrict

  3. Và cuối cùng chèn các lời mời, INSERT OVERWRITE TABLE Ấn Độ PARTITION (STATE) CHỌN COL của FROM invites_stg;

Tham khảo link này để được giúp đỡ: http://www.edupristine.com/blog/hive-partitions-example

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