2013-01-11 27 views
5

Tôi đang làm việc trên một dự án viễn thông, sử dụng Hadoop - hive để phân tích dữ liệu. Trong một ngày, chúng tôi sẽ nhận được hàng triệu hồ sơ. Sau khi được chỉ định không có ngày, chúng tôi cần xóa dữ liệu cũ vì chúng tôi không có dung lượng lưu trữ. Cách tốt nhất để xóa hồ sơ là gì?Hadoop - Hive: Xóa dữ liệu cũ hơn số ngày được chỉ định

Thông tin bổ sung:

Bảng hive sẽ có cột có ngày được điền.

Trả lời

11

Tôi nghĩ rằng trường hợp sử dụng của bạn cho vay rất tốt để sử dụng phân vùng "ngày" trong bảng Hive của bạn. Nếu "ngày" chỉ là một cột nó sẽ trở nên khó khăn để duy trì và làm sạch bảng của bạn.

Thật là một phân vùng thực sự có nghĩa trong Hive là bạn sẽ có một thư mục cho mỗi "ngày"

Vì vậy, ví dụ:

create table mytable (
    ... 
) partitioned by (day string) 

Vì vậy, khi bạn thêm dữ liệu bạn sẽ có ví dụ như sau cấu trúc trong HDFS:

/user/hive/warehouse/mytable/day=2013-01-10 
/user/hive/warehouse/mytable/day=2013-01-11 
... 

Và trong mỗi phân vùng bạn sẽ có nội dung cho ngày đó.

Sau đó, xóa dữ liệu cũ trở nên tầm thường, bạn có thể ví dụ có một công việc cron chạy hàng ngày và xóa dữ liệu trong nhiều ngày x trước (ví dụ sử dụng lệnh date --date '30 days ago' +\%Y-\%m-\%d) và chỉ cần thực hiện lệnh sau:

hadoop fs -rmr -skiptrash /user/hive/warehouse/mytable/day=`date --date '30 days ago' +\%Y-\%m-\%d` 

Tại thời điểm này, bạn sẽ vẫn có phân vùng trong bảng Hive nếu bạn thực hiện show partitions mytable nhưng bất kỳ truy vấn nào đến phân vùng nơi bạn đã xóa dữ liệu sẽ không trả về gì cả. Nếu bạn thực sự muốn xóa phân vùng đó trong metastore, bạn phải sử dụng lệnh sau:

ALTER TABLE mytable DROP PARTITION (day='xxxx-xx-xx'); 

Tôi đã sử dụng mô hình rất giống thành công trong một thời gian và hoạt động tốt.

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