如何在Pig中查询极值关联数据:获取每日最低温时段
获取每日最低气温对应的时段(Pig Latin实现)
看起来你已经在尝试用Pig Latin按日期分组计算最低温了,但目前的代码只能拿到温度值,没法关联对应的时段对吧?别担心,我来帮你完善这个逻辑!
先整理下你的原始气温数据
你提供的原始数据如下(已格式化):
- (2015/12/27,12AM,32.0)
- (2015/12/27,12PM,34.0)
- (2015/12/28,10AM,26.1)
- (2015/12/28,10PM,28.0)
- (2015/12/28,11AM,27.0)
- (2015/12/28,11PM,28.9)
- (2015/12/28,12AM,25.0)
- (2015/12/28,12PM,26.100000000000005)
- (2015/12/29,10AM,22.45)
- (2015/12/29,10PM,26.1)
- (2015/12/29,11AM,24.1)
- (2015/12/29,11PM,25.0)
- (2015/12/29,12AM,28.9)
问题分析
你当前的FOREACH gdate2 GENERATE group as day,MIN(rem...)只能提取到每日最低温度值,但没办法同时拿到对应的时段。要解决这个问题,我们需要在分组后对每组内的数据按温度排序,然后取出温度最低的那条完整记录。
完整的Pig Latin解决方案
-- 1. 加载原始数据并清洗(处理括号和分割字段) raw_data = LOAD 'your_data_file_path' USING PigStorage(',') AS (col1:chararray, col2:chararray, col3:chararray); -- 清洗数据,去掉括号并提取有效字段 clean_data = FOREACH raw_data GENERATE -- 提取日期:去掉开头的( REGEX_EXTRACT(col1, '^\\((.*)', 1) AS day:chararray, -- 提取时段:直接取col2的值 col2 AS time_slot:chararray, -- 提取温度:去掉结尾的) REGEX_EXTRACT(col3, '(.*)\\)$', 1) AS temperature:double; -- 2. 按日期分组 gdate2 = GROUP clean_data BY day; -- 3. 分组内排序并获取最低温记录 min_temp_details = FOREACH gdate2 { -- 对组内数据按温度升序排序(温度最小的排最前面) sorted_records = ORDER clean_data BY temperature ASC; -- 取排序后的第一条记录,就是当日最低温的完整数据 lowest_temp_record = LIMIT sorted_records 1; -- 生成最终结果:日期、最低温时段、最低温度 GENERATE group AS day, FLATTEN(lowest_temp_record.time_slot) AS lowest_temp_time, FLATTEN(lowest_temp_record.temperature) AS lowest_temperature; } -- 4. 查看结果 DUMP min_temp_details;
预期输出结果
运行上述代码后,你会得到如下结果:
(2015/12/27,12AM,32.0) (2015/12/28,12AM,25.0) (2015/12/29,10AM,22.45)
关键说明
- 为什么不用
MIN()直接关联?因为Pig的MIN()聚合函数只能返回单一的最小值,无法关联到对应的其他字段(比如时段)。 - 通过
ORDER + LIMIT的方式,我们可以拿到组内温度最低的完整记录,从而同时获取时段和温度值。
内容的提问来源于stack exchange,提问作者zac s
相关产品推荐
相关产品推荐

