Apache pig 计算布尔列上的百分比

Apache pig 计算布尔列上的百分比,apache-pig,hortonworks-data-platform,Apache Pig,Hortonworks Data Platform,假设我的数据具有以下结构: 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 我

假设我的数据具有以下结构:

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
我试图计算每一年和每一个地点的新客户的真实价值百分比,因此从结构示例中获取记录的示例如下

2018     | Paris    | 66
2018     | London   | 100
2018     | Madrid   | 50
2017     | Paris    | 100
根据我当前的脚本进行改编是非常困难的,但不同之处在于它使用了两列(年份和地点),而不是一列

问题是,这使用的是年份作为参考,而我需要它是年份和地区


感谢您的帮助。

您需要同时按
年份
位置
进行分组,这需要进行两次修改。首先,将
Location
添加到GROUPBY语句中。其次,将
展平(组)为年份
更改为
展平(组)为(年份、位置)
,因为
现在是一个包含两个字段的元组

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;
};

您需要同时按
年份
位置
进行分组,这需要进行两次修改。首先,将
Location
添加到GROUPBY语句中。其次,将
展平(组)为年份
更改为
展平(组)为(年份、位置)
,因为
现在是一个包含两个字段的元组

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;
};

已测试此代码,看起来适合我:

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)

已测试此代码,看起来适合我:

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)