Предложите наиболее оптимальный способ, используя улей или свинью - PullRequest
0 голосов
/ 28 июня 2018

Постановка проблемы Предположим, есть один текстовый файл журналов. Ниже приведены поля в файле.

Файл журнала

userID
productID
action

Где действие будет одним из них -

Browse, Click, AddToCart, Purchase, LogOut

Выберите пользователей, которые выполнили действие AddToCart, но не выполнили действие Покупка.

('1001','101','201','Browse'),
('1002','102','202','Click'),
('1001','101','201','AddToCart'),
('1001','101','201','Purchase'),
('1002','102','202','AddToCart')

Может кто-нибудь предложить получить эту информацию, используя улей или свинью с оптимизированной производительностью

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Это можно сделать с помощью sum () или аналитической суммы () в зависимости от точных требований при сканировании одной таблицы. Что если пользователь добавил в корзину два товара, а купил только один?

Для пользователей + Продукт:

select userID, productID 
  from
(
select 
       userID,
       productID,
       sum(case when action='AddToCart' then 1 else 0 end) addToCart_cnt,
       sum(case when action='Purchase' then 1 else 0 end)  Purchase_cnt
  from table
  group by userID, productID
)s
where addToCart_cnt>0 and Purchase_cnt=0
0 голосов
/ 28 июня 2018

Улей : Использование not in

select * from table 
where action='AddtoCart' and 
      userID not in (select distinct userID from table where action='Purchase')

Свинья : отфильтровать идентификаторы с помощью действия, выполнить левое соединение и проверить, что идентификатор равен нулю

A = LOAD '\path\file.txt' USING PigStorage(',') AS (userID:int,b:int,c:int,action:chararray) -- Note I am assuming the first 3 columns are int.You will have to figure out the loading without the quotes.
B = FILTER A BY (action='AddToCart');
C = FILTER A BY (action='Purchase');
D = JOIN B BY userID LEFT OUTER,C BY userID;
E = FILTER D BY C.userID is null;
DUMP E;
...