2014-10-09 3 views
1

У меня есть набор данных в свинки, который выглядит следующим образом:Pig - Расчет

6009544 "NY" 6009545 "NY" 
6009544 "NY" 6009545 "NY" 
6009548 "NY" 6009546 "OR" 
6009546 "OR" 6009546 "OR" 
6009545 "NY" 6009546 "OR" 
6009548 "NY" 6009547 "AZ" 
6009547 "AZ" 6009547 "AZ" 
6009547 "AZ" 6009548 "NY" 
6009544 "NY" 6009548 "NY" 

Первая строка читается так: «патент 6009544 возникла в Нью-Йорке, и цитирует патент 6009545, которая возникла в Нью-Йорке. " Я пытаюсь найти для каждого государства% упомянутых патентов, исходящих из одного и того же состояния. Так что мой ожидаемый результат должен быть

NY: .5 
OR: 1 
AZ: .5 

из-за 6 патентов, которые произошли в Нью-Йорке, 3 ссылаются на патенты, которые также зародилось в Нью-Йорке. 1 патент, который появился в Орегоне, ссылается на патент, который также появился в Нью-Йорке. И из 2 патентов, которые возникли в Аризоне, 1 цитирует патент, который также возник в Аризоне.

Может ли кто-нибудь предложить хороший способ для выполнения этого в Pig?

ответ

1

Можете ли вы попробовать это?

input.txt 
6009544 "NY" 6009545 "NY" 
6009544 "NY" 6009545 "NY" 
6009548 "NY" 6009546 "OR" 
6009546 "OR" 6009546 "OR" 
6009545 "NY" 6009546 "OR" 
6009548 "NY" 6009547 "AZ" 
6009547 "AZ" 6009547 "AZ" 
6009547 "AZ" 6009548 "NY" 
6009544 "NY" 6009548 "NY" 

PigScript: 
A = LOAD 'input.txt' AS line; 
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(\\d+)\\s+"(\\w+)"\\s+(\\d+)\\s+"(\\w+)"')) AS (f1:int,f2:chararray,f3:int,f4:chararray); 
C = GROUP B BY f2; 
D = FOREACH C { 
       FilterByPatent = FILTER B BY f2==f4; 
       CityPatentCount = COUNT(B.f2); 
       GENERATE group,((float)COUNT(FilterByPatent)/(float)CityPatentCount); 
       } 
DUMP D; 

Output: 
(AZ,0.5) 
(NY,0.5) 
(OR,1.0) 
+0

Этот метод отлично работает - спасибо! – Luke

0

меняю выборочные данные и отдельные данные, используя пространство:

A = load '/padata' using PigStorage(' ') as (pno:int,pcity:chararray,pci:int,pccity:chararray); 

b = group A by pcity ; 

r = foreach b { 

       copcity= COUNT(A.pcity) ; 

       samdata = FILTER A by pcity==pccity; 

       csamdata = COUNT(samdata); 

       percent = (float)csamdata/(float)copcity; 

       generate group,percent ; 

       } 

dump r ; 

Выход: -

("AZ",0.5) 

("NY",0.5) 

("OR",1.0) 
Смежные вопросы