关于hive multi group by的疑惑

 有多条hive语句从同一张表中做count操作,语句如下:

 select pf,way,method,count(distinct id) where push_date_type ='$push_date_type' group by pf,way,method; 
select pf,way,-1,count(distinct id) where push_date_type ='$push_date_type' group by pf,way;
 ......

  想着用multi group by特性优化下效率,于是把上述语句改写成:

from push_revisit_info 
    insert overwrite table push_rpt_pf_way_mthd
        select pf,way,method,count(distinct id) where push_date_type ='$push_date_type' group by pf,way,method
    insert overwrite table push_rpt_pf_way
        select pf,way,-1,count(distinct id) where push_date_type ='$push_date_type' group by pf,way

参数hive.multigroupby.singlemr也设置成了true;

可是这条语句还是会生成两个mapreduce执行,跟未使用multi group by时MR Job数量一样,甚至执行时间还稍长。

如果这两句的group key用成一样,就会只生成一个MR Job,但不论hive.multigroupby.singlemr是true还是false,都是这样。

关于这个参数的含义,hive-default.xml是这样写的:

<property>
    <name>hive.multigroupby.singlemr</name>
    <value>false</value>
    <description>Whether to optimize multi group by query to generate single M/R
        job plan. If the multi group by query has common group by keys, it will be
        optimized to generate single M/R job.</description>
</property>

这里的common翻译成什么最合适呢?“共同的”?那依上面的经验,不用开启这个设置也会优化成一个。那么这个参数到底有什么用?multi group by又如何使用呢?  

转载于:https://www.cnblogs.com/aprilrain/archive/2013/03/18/2966125.html

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、付费专栏及课程。

余额充值