我有一个非常大的表,CLAIMS,包含以下列:
p_key
c_key
claim_type
每一行由p_key,c_key唯一定义。通常每个p_key会有多个c_keys。该表如下所示:
p_key c_key claim_type
1 1 A
1 2 A
2 3 B
2 5 C
3 1 B
我想找到每个p_key的最小c_key。这是我的问题:
SELECT p_key,
min(c_key) as min_ckey
from CLAIMS
GROUP BY p_key
问题是,当我通过HIVE CLI(0.13)将其作为mapreduce工作运行时,reduce部分需要30分钟才能完成5%。我不完全确定什么可能导致简单的查询需要这么长时间。此查询提供了相同的问题:
SELECT p_key,
row_number() OVER(PARTITION BY p_key ORDER BY c_key) as RowNum
from CLAIMS
所以我的问题是为什么看似简单的mapreduce工作的减少部分需要这么长时间?关于如何调查此问题/改进查询的任何建议也将不胜感激。
答案 0 :(得分:1)
您知道数据是否不平衡?如果有一个p_key
的{{1}}值与普通情况相比非常大,那么处理该p_key的reducer将花费很长时间。
或者,是否可能存在少量c_key
值?由于您按p_key
进行分组,这将限制执行有用工作的减速器数量。
答案 1 :(得分:1)
减少阶段分三个阶段进行。当< = 33%是洗牌时,33%和66%之间是分类,并且> = 67%是减少阶段。
你的工作听起来像是在减少阶段的洗牌部分被挂起。我的猜测是你的数据遍布全部,这部分是IO绑定的。您的观察结果将转移到减速器上。
您可以尝试分组数据:
create table claim_bucket (p_key string, c_key string, claim_type string)
clustered by (p_key) into 6 buckets
row format delimited fields terminated by ",";
您可能需要更多或更少的存储桶,这将需要初始化hive的一些繁重工作,但应加快后续查询使用p_key的表。
当然,你还没有留下太多其他东西。如果您发布编辑并提供更多信息,您可能会得到更好的答案。祝你好运。