2017-02-24 292 views
1

我有以下要求。計算豬的百分比

測試數據具有以下值。

我需要找出總數中每個字符的百分比。

我試着用下面的查詢,但沒有成功。

Ex: 
W 
H 
U 
U 
H 
W 
U 
W 
W 
H 
W 
U 
H 
H 
H 
U 
W 
W 
W 
H 

data = LOAD 'location of test data'; 

grp = GROUP data BY data.$0; // considering only 1 field in this csv. 

result = FOREACH grp GENERATE group, COUNT(data.$0)/SUM(data.$0); 

由於字段是chararrays,我不能做字段的總和。

有沒有找到一個替代?

如果我使用GROUP ALL,然後是COUNT(數據。$ 0),我得到條目的總數。

如果我使用該字段的GROUP,然後是COUNT(數據。$ 0),我可以得到個人數。

在這裏我需要這個總數的個人計數的百分比。

在此先感謝。

回答

1

在這裏,我需要這個人計數由總量的比例。

要做到這一點,你需要運行兩個豬運營,我相信 - 1)首先,你說讓個別計數一個關係

W 8 
H 7 
U 5 

2)其次,你指望所有的元素你一個關於前面提到的

total 20 

3)然後你需要跨越的第一和兩個(CROSS)獲得的關係,使你有一個像這樣

0123的新關係
W 8 20 
H 7 20 
U 5 20 

4)發佈此,就可以計算出你想要的百分比。

更新

下面是我想出了豬腳本。

A = LOAD 'data.txt' using PigStorage('\n'); 
--DUMP A; 
B = GROUP A by $0; 
C = FOREACH B GENERATE group, COUNT(A.$0); 
--DUMP C; 
D = GROUP A ALL; 
E = FOREACH D GENERATE group,COUNT(A.$0); 
DUMP E; 
DESCRIBE C; 
DESCRIBE E; 
F = CROSS C,E; 
G = FOREACH F GENERATE $0,$1,$3,($1*100/$3); 
DESCRIBE G; 
DUMP G; 
+0

GRP1 = GROUP BY數據$ 0; individual = FOREACH grp1 GENERATE group,COUNT(data。$ 0); grp2 =組數據ALL; sumation = FOREACH grp2 GENERATE組,COUNT(數據。$ 0); 結果=加入單個BY數據$ 0 FULL OUTER,sumation BY數據$ 0 這是在處理「標量具有多個輸出...」時發生錯誤.. –

+0

您可以檢查是否轉儲個人和求和按預期轉儲數據。 – Amit

+0

這工作。我必須執行CROSS加入。 –

0

你必須這樣做手工,

data = foreach data generate *, ((B=='b1')?1:0) AS dummy_b1; 
data = foreach data generate *, mean(dummy_b1) AS percentage;