如何在Apache Pig中统计分组后WIC与WICcash列的Y值总数?
搞定Pig统计需求:计算Douglas县WIC相关列的Y总数
我来帮你实现这个统计需求,你只需要在现有代码基础上添加几步计算逻辑就行,下面分两种实现方式给你讲解:
方式一:先计算单条记录的Y数,再分组求和(更清晰易维护)
-- 1. 加载原始数据 load_data = LOAD 'PigPrograms/Markets/DATA_GOV_US_Farmers_Market_DataSet.csv' USING PigStorage(',') as (FMID:long,County:chararray, WIC:chararray, WICcash:chararray); -- 2. 新增:给每条记录计算WIC和WICcash列中Y的数量 count_y_per_record = FOREACH load_data GENERATE County, -- 三元判断:是Y就加1,否则加0,两个列的结果相加 (WIC == 'Y' ? 1 : 0) + (WICcash == 'Y' ? 1 : 0) as single_row_y_count; -- 3. 按County分组,对每个县的Y总数求和 county_total = GROUP count_y_per_record BY County; final_result = FOREACH county_total GENERATE group as County, SUM(count_y_per_record.single_row_y_count) as total_y; -- 4. 筛选出Douglas县的结果 douglas_result = FILTER final_result BY County == 'Douglas'; -- 输出结果,就是你要的Douglas 3 DUMP douglas_result;
方式二:直接在已筛选的分组上计算(更紧凑)
如果不想多一步单条记录计算,也可以直接在你已经筛选好的Douglas分组上做统计:
-- 你原有的加载、分组、筛选步骤 load_data = LOAD 'PigPrograms/Markets/DATA_GOV_US_Farmers_Market_DataSet.csv' USING PigStorage(',') as (FMID:long,County:chararray, WIC:chararray, WICcash:chararray); group_markets_by_county = GROUP load_data BY County; filter_county = FILTER group_markets_by_county BY group == 'Douglas'; -- 新增:直接对分组内的所有记录计算Y的总数 calculate_total = FOREACH filter_county GENERATE group as County, -- 对分组里的每条记录计算Y数,再求和 SUM( (load_data.WIC == 'Y' ? 1 : 0) + (load_data.WICcash == 'Y' ? 1 : 0) ) as total_y; DUMP calculate_total;
关键逻辑说明
两种方式的核心都是用三元运算符判断每个列是否为Y,转化为数值后求和:
(WIC == 'Y' ? 1 : 0):如果WIC是Y就返回1,否则0- 两个列的数值相加得到单条记录的Y数量,再用
SUM()函数对整个分组的数值求和,就得到了Douglas县的总Y数3。
运行任意一种代码,最终都会输出(Douglas,3),完全符合你的期望。
内容的提问来源于stack exchange,提问作者Binayak Biswas
相关产品推荐
相关产品推荐

