2012-09-26 21 views
7

Tôi có một tập tin văn bản rất lớn của các hình thứcphát hiện có nghĩa là sử dụng lợn hoặc hadoop

dữ liệu được lưu trong dữ liệu thư mục/data1.txt, data2.txt và vân vân

merchant_id, user_id, amount 
1234, 9123, 299.2 
1233, 9199, 203.2 
1234, 0124, 230 
and so on.. 

Những gì tôi muốn làm dành cho mỗi người bán, tìm số tiền trung bình ..

vì vậy về cơ bản cuối cùng tôi muốn lưu đầu ra vào tệp. giống như

merchant_id, average_amount 
    1234, avg_amt_1234 a 
    and so on. 

Làm cách nào để tính độ lệch chuẩn?

Xin lỗi vì đã hỏi một câu hỏi cơ bản như vậy. :( Mọi trợ giúp sẽ được đánh giá cao. :)

+0

Câu trả lời hay cho câu hỏi này sẽ phải đề cập đến các khái niệm cơ bản về hadoop cũng như các thuật toán cần thiết để tính toán các số liệu khác nhau.Tôi sẽ chỉnh sửa lại câu hỏi này, hoặc có thể yêu cầu một câu hỏi khác và nêu lên những gì bạn biết về cách giải quyết vấn đề này với heo hoặc lợn và cụ thể hơn về một thứ đang giữ bạn. –

Trả lời

12

Apache PIG được điều chỉnh tốt cho các tác vụ như vậy. Xem ví dụ:

inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray,c2:chararray); 
grp = group inpt by id; 
mean = foreach grp { 
    sum = SUM(inpt.amnt); 
    count = COUNT(inpt); 
    generate group as id, sum/count as mean, sum as sum, count as count; 
}; 

Đặc biệt chú ý đến kiểu dữ liệu của cột amnt vì nó sẽ ảnh hưởng đến việc thực hiện hàm SUM mà PIG sẽ gọi ra.

PIG cũng có thể làm điều gì đó mà SQL không thể, nó có thể đặt giá trị trung bình đối với mỗi hàng đầu vào mà không sử dụng bất kỳ kết nối bên trong nào. Điều đó rất hữu ích nếu bạn đang tính toán điểm số z bằng cách sử dụng độ lệch chuẩn.

mean = foreach grp { 
    sum = SUM(inpt.amnt); 
    count = COUNT(inpt); 
    generate FLATTEN(inpt), sum/count as mean, sum as sum, count as count; 
}; 

FLATTEN (inpt) thực hiện thủ thuật, bây giờ bạn có quyền truy cập vào số tiền ban đầu đã đóng góp cho số tiền trung bình nhóm, tổng và số.

UPDATE 1:

Calculating variance and standard deviation:

inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray, c2:chararray); 
grp = group inpt by id; 
mean = foreach grp { 
     sum = SUM(inpt.amnt); 
     count = COUNT(inpt); 
     generate flatten(inpt), sum/count as avg, count as count; 
}; 
tmp = foreach mean { 
    dif = (amnt - avg) * (amnt - avg) ; 
    generate *, dif as dif; 
}; 
grp = group tmp by id; 
standard_tmp = foreach grp generate flatten(tmp), SUM(tmp.dif) as sqr_sum; 
standard = foreach standard_tmp generate *, sqr_sum/count as variance, SQRT(sqr_sum/count) as standard; 

Nó sẽ sử dụng 2 công việc. Tôi đã không tìm ra cách để làm điều đó trong một, hmm, cần phải dành nhiều thời gian hơn vào nó.

+0

làm cách nào để tính toán độ lệch chuẩn ?? – Fraz

+0

xem CẬP NHẬT 1 .... – alexeipab

+0

có bất kỳ cơ hội tổng giá trị nào bị tràn không? Tôi đang cố gắng thực hiện một cái gì đó như thế này nhưng tôi lo ngại về tràn. – siddardha

1

Vì vậy, bạn muốn gì? Bạn muốn chạy mã java hoặc quá trình map-reduce trừu tượng? Cho phần thứ hai:

Bước bản đồ:

record -> (merchant_id as key, amount as value) 

Các giảm bước:

(merchant_id, amount) -> (merchant_id, aggregate the value you want) 

Như trong bước giảm, bạn sẽ được cung cấp một dòng kỷ lục có chìa khóa giống nhau và bạn có thể làm gần như tất cả mọi thứ bạn có thể bao gồm trung bình, phương sai.

1

bạn có thể tính toán độ lệch chuẩn chỉ trong một bước; sử dụng công thức

var=E(x^2)-(Ex)^2 
inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray, c2:chararray); 
grp = group inpt by id; 
mean = foreach grp { 
    sum = SUM(inpt.amnt); 
    sum2 = SUM(inpt.amnt**2); 
    count = COUNT(inpt); 
    generate flatten(inpt), sum/count as avg, count as count, sum2/count- (sum/count)**2 as std; 
}; 

là vậy!

+0

Vui lòng cân nhắc cải thiện định dạng cho câu trả lời của bạn cùng với một số mô tả. –

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