hive的muti group by

本文探讨了在使用 mūtī gūrōu 进行 Hive 查询前后的运行时间差异,通过具体代码示例展示了查询过程,并分析了性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用muti group by之前:

echo "订购 下载 试听 搜索 pv uv :============================================= "
hive -e "use platform;
select ${group},sum(buy),sum(down),sum(listen),sum(search),sum(pv),count(distinct IMSI) from(
select ${group},IMSI,
case when action=1 then 1 else 0 end as buy,
case when action=2 then 1 else 0 end as down,
case when action=3 then 1 else 0 end as listen,
case when action=4 then 1 else 0 end as search,
case when (${pvcase}) then 1 else 0 end as pv
from T_FeedbackAccessday2 where ${case}
)middle group by ${group};"  | grep "2013-" >tmp.data


echo "流量:============================================= "
hive -e "use platform;
select day,porttype,subporttype,'flow',sum(abs(yidong)), sum(abs(notyidong)) from(
select day,porttype,subporttype,
case when (UCASE(network) in('CTWAP','CTNET') and abs(FluxByte)<10485760) then FluxByte else cast(0 as bigint) end as yidong,
case when (UCASE(network) not in('CTWAP','CTNET') and abs(FluxByte)<10485760) then FluxByte else cast(0 as bigint) end as notyidong
from T_FeedbackAccessday2 where ${case} and (PortType !=5 OR subporttype!=4) OR (PortType =5 and subporttype =4 and ActionModule= 'actionFeedback')) middle
group by day,porttype,subporttype" | grep "2013-" >flow.data





使用后:

hive -e "use platform;
from T_FeedbackAccessday2
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='buy')
select porttype,subporttype,comefrom,'',sum(case when action=1 then 1 else 0 end) as buy where ${case}
group by ${group}
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='down')
select porttype,subporttype,comefrom,'',sum(case when action=2 then 1 else 0 end) as buy where ${case}
group by ${group}
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='listen')
select porttype,subporttype,comefrom,'',sum(case when action=3 then 1 else 0 end) as buy where ${case}
group by ${group}
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='search')
select porttype,subporttype,comefrom,'',sum(case when action=4 then 1 else 0 end) as buy where ${case}
group by ${group}
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='uv')
select porttype,subporttype,comefrom,'',count(distinct IMSI) as buy where ${case}
group by ${group}
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='pv')
select porttype,subporttype,comefrom,'',sum(${pvcase}) as buy where ${case}
group by ${group}
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='yidong')
select porttype,subporttype,'','',sum(${yidongcase}) as buy where ${case}
group by porttype,subporttype
INSERT OVERWRITE TABLE result2 PARTITION(day='${day}',category='notyidong')
select porttype,subporttype,'','',sum(${notyidongcase}) as buy where ${case}
group by porttype,subporttype;"




从我的这个使用场景来看,使用前后的运行时间是差不多的.
Hive 中使用 `GROUP BY` 进行去重时,如果发现去重无效,通常是因为字段的语义或数据分布特性导致无法有效分组。以下是可能导致 `GROUP BY` 去重失败的原因及相应的解决方法: ### 原因分析 1. **字段包含空值或不可见字符**: - 如果分组字段中包含空值(NULL)或不可见字符(如空格、换行符等),Hive 会将这些视为不同的值,从而导致去重失败。 2. **字段类型不匹配**: - 如果用于分组的字段类型不一致(例如字符串和数字混合),可能会导致分组结果不符合预期。 3. **未正确使用聚合函数**: - `GROUP BY` 的核心在于聚合操作,如果未正确使用聚合函数(如 `MAX`、`MIN`、`COUNT` 等),可能导致结果中出现重复值。 4. **数据倾斜**: - 数据倾斜可能导致某些 `GROUP BY` 键的处理效率低下,从而影响去重效果。 ### 解决方法 1. **清理数据**: - 在分组前,清理字段中的空值或不可见字符。例如,使用 `TRIM` 函数去除空格,或使用正则表达式替换不可见字符。 ```sql SELECT TRIM(column_name) AS cleaned_column FROM table_name GROUP BY TRIM(column_name); ``` 2. **转换字段类型**: - 确保分组字段的类型一致。例如,将字符串类型的字段转换为整数类型(如果适用)。 ```sql SELECT CAST(column_name AS INT) AS converted_column FROM table_name GROUP BY CAST(column_name AS INT); ``` 3. **使用聚合函数**: - 在 `GROUP BY` 语句中,确保使用聚合函数对非分组字段进行处理。例如,使用 `MAX`、`MIN` 或 `COUNT`。 ```sql SELECT column1, MAX(column2) AS max_value FROM table_name GROUP BY column1; ``` 4. **优化数据倾斜**: - 启用 Hive 的数据倾斜优化配置,例如 `hive.groupby.skewindata`,以均衡 `GROUP BY` 操作的负载。 ```sql SET hive.groupby.skewindata = true; SELECT column1, COUNT(*) AS count_value FROM table_name GROUP BY column1; ``` 5. **结合 `DISTINCT` 使用**: - 如果需要完全去重,可以结合 `DISTINCT` 关键字进行操作。例如: ```sql SELECT DISTINCT column1, column2 FROM table_name; ``` 6. **分步处理**: - 将复杂操作拆分为多个步骤,先进行初步的 `GROUP BY` 聚合,再对结果进行二次处理。 ```sql -- 第一步:初步聚合 CREATE TABLE temp_table AS SELECT column1, COUNT(*) AS count_value FROM table_name GROUP BY column1; -- 第二步:二次处理 SELECT column1 FROM temp_table WHERE count_value > 0; ``` ### 总结 Hive 中 `GROUP BY` 去重无效的问题通常与数据质量、字段类型或聚合逻辑有关。通过清理数据、转换字段类型、正确使用聚合函数以及优化数据倾斜,可以有效解决去重失败的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值