2013-01-17 40 views
5

gần đây tôi muốn tải các tệp nhật ký vào bảng hive, tôi muốn có công cụ có thể đọc dữ liệu từ một thư mục nhất định và tự động tải chúng vào tổ ong. Thư mục này có thể bao gồm nhiều thư mục con, ví dụ, thư mục nhất định là '/ log' và các thư mục con là '/ log/20130115', '/ log/20130116', '/ log/201301017'. Có một số công cụ ETL có thể đạt được chức năng đó: khi dữ liệu mới được lưu trữ trong thư mục nhất định, công cụ có thể tự động phát hiện dữ liệu này và tải chúng vào bảng hive. Có những công cụ như vậy không, tôi có phải tự mình viết kịch bản không?cách tải dữ liệu trong hive tự động

Trả lời

4

Bạn có thể dễ dàng thực hiện việc này bằng cách sử dụng bảng bên ngoài Hive và phân vùng bảng của bạn theo ngày. Ví dụ, tạo bảng của bạn như vậy:

create external table mytable(...) 
partitioned by (day string) 
location '/user/hive/warehouse/mytable'; 

này về cơ bản sẽ tạo ra một bảng trống trong metastore và làm cho nó trỏ đến /user/hive/warehouse/mytable.

Sau đó, bạn có thể tải dữ liệu của bạn trong thư mục này với phím định dạng = giá trị nơi chính là tên phân vùng của bạn (ở đây "ngày") và giá trị là giá trị của phân vùng của bạn. Ví dụ:

hadoop fs -put /log/20130115 /user/hive/warehouse/mytable/day=20130115 

Sau khi dữ liệu của bạn được tải ở đó, nó đang ở trong thư mục HDFS, nhưng metastore Hive chưa biết rằng nó thuộc về bảng, do đó bạn có thể thêm nó theo cách này:

alter table mytable add partition(day='20130115'); 

Và bạn nên làm tốt, di chuyển sẽ được cập nhật với phân vùng mới của bạn và bây giờ bạn có thể truy vấn bảng của bạn trên phân vùng này.

này nên được tầm thường để kịch bản, bạn có thể tạo một công việc cron chạy mỗi ngày một lần mà sẽ thực hiện những lệnh theo thứ tự và tìm các phân vùng để tải với lệnh date, ví dụ liên tục làm lệnh này:

hadoop fs -test /log/`date +%Y%m%d` 

và kiểm tra xem $? bằng 0 sẽ cho bạn biết liệu tệp có ở đây không và nếu có, bạn có thể chuyển tệp và thêm phân vùng như được mô tả ở trên.

+0

thanks a lot, trên thực tế, tôi có một câu hỏi xa hơn, bằng cách này tôi có thể tải của tôi tuy nhiên, sếp của tôi đã yêu cầu tôi tìm cách tiếp cận hoặc công cụ để tải dữ liệu, điều đó có nghĩa là: giả sử có một thư mục nhất định được gọi là '/ log', tổ ong sẽ truy vấn thư mục này mọi lúc , khi dữ liệu mới được tạo, có thể/log/20130118,/log/20130119, tổ ong sẽ tự động thêm phân vùng này và tải tệp nhật ký như/20130118 hoặc/20130119 vào phân vùng của bảng, cách tôi có thể đạt được điều đó, cầu xin sự tha thứ của bạn –

+0

Khi bạn chỉ định từ khóa 'EXTERNAL' dữ liệu của bạn không được sao chép ở bất kỳ đâu và ở lại vị trí bạn đã chạm vào nó. (Khi bạn không chỉ định 'EXTERNAL', Hive sẽ sao chép dữ liệu vào vị trí mặc định của nó). Theo tôi biết, mỗi lần bạn thêm tệp vào thư mục được chỉ định bởi 'LOCATION' và bạn truy vấn bảng của mình sau đó, dữ liệu mới sẽ hiển thị. Đã một thời gian kể từ khi tôi chơi với Hive, vì vậy có thể @Charles Menguy có thể xác nhận điều này? – Pieterjan

+0

Tôi không chắc chắn 100% tôi hiểu những gì bạn muốn đạt được, bạn có thể chỉnh sửa câu hỏi của mình với nhiều chi tiết hơn không?Nếu bạn chỉ muốn tải các tệp phẳng vào bảng của mình mà không có phân vùng ngày, thì @Pieterjan là đúng, bạn chỉ có thể đặt các tệp ở gốc của bảng trong HDFS và bạn không cần thay đổi bảng, Hive sẽ trực tiếp chọn nó lên. –

1

Bạn có thể sử dụng lệnh LOAD DATA do Hive cung cấp. Nó chính xác phù hợp với trường hợp sử dụng của bạn. Chỉ định một thư mục trong hệ thống tệp cục bộ của bạn và tạo các bảng Hive từ nó.

Ví dụ sử dụng - LOAD DATA LOCAL INPATH '/ home/user/một số thư mục' OVERWRITE VÀO bảng TABLE

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