Вычислить процент в логическом столбце

Предполагая, что мои данные имеют следующую структуру:

Year      | Location | New_client 

2018      | Paris    | true
2018      | Paris    | true
2018      | Paris    | false
2018      | London   | true
2018      | Madrid   | true
2018      | Madrid   | false
2017      | Paris    | true

Я пытаюсь рассчитать для каждого года и местоположения процент истинного значения для New_client, поэтому пример, в котором используются записи из примера структуры, будет

2018     | Paris    | 66
2018     | London   | 100
2018     | Madrid   | 50
2017     | Paris    | 100

Адаптация из https://stackoverflow.com/a/13484279/2802552 моего текущего сценария, но разница в том, что вместо 1 столбец использует 2 столбца (год и местоположение)

data = load...
grp = group inpt by Year; -- creates bags for each value in col1 (Year)
result = FOREACH grp {
    total = COUNT(data);
    t = FILTER data BY New_client == 'true'; --create a bag which contains only T values
    GENERATE FLATTEN(group) AS Year, total AS TOTAL_ROWS_IN_INPUT_TABLE, 100*(double)COUNT(t)/(double)total AS PERCENTAGE_TRUE_IN_INPUT_TABLE;
};

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

Спасибо за вашу помощь.


person adaba    schedule 03.02.2018    source источник


Ответы (2)


Вам нужно сгруппировать как по Year, так и по Location, что потребует двух модификаций. Во-первых, добавьте Location к оператору group by. Во-вторых, измените FLATTEN(group) AS Year на FLATTEN(group) AS (Year, Location), так как group теперь является кортежем с двумя полями.

grp = group inpt by (Year, Location);
result = FOREACH grp {
    total = COUNT(inpt);
    t = FILTER inpt BY New_client == 'true';
    GENERATE 
        FLATTEN(group) AS (Year, Location), 
        total AS TOTAL_ROWS_IN_INPUT_TABLE, 
        100*(double)COUNT(t)/(double)total AS PERCENTAGE_TRUE_IN_INPUT_TABLE;
};
person savagedata    schedule 05.02.2018

Протестировал этот код и выглядит как работающий для меня:

A = LOAD ...
B = GROUP A BY (year, location);
C = FOREACH B  {
    TRUE_CNT = FILTER A BY (chararray)new_client == 'true';
    GENERATE group.year, group.location, (int)((float)COUNT(TRUE_CNT) / COUNT(A) * 100);
}

DUMP C;
(2017,Paris,100)
(2018,Paris,66)
(2018,London,100)
(2018,Madrid,50)
person Nazar Merza    schedule 05.02.2018