我正在尝试使用hive执行此查询,但它需要永远运行,尤其是在进入reducer步骤之后。它说mappers:451,redurs:1。
create table mb.ref201501_nontarget as select * from adv.raf_201501 where target=0 limit 200000;
我改变查询的动机来自这个答案:
Hive unable to manually set number of reducers
我尝试将查询更改为:
create table mb.ref201501_nontarget as select * from (select * from adv.raf_201501 limit 200000) where target=0;
但它的投掷错误。
答案 0 :(得分:0)
这个问题非常模糊,如果您认为最后一个查询产生了正确的结果(请注意它与第一个查询不同!!)这应该可以解决问题:
create table mytmptbl = select * from advanl.raf_201501 limit 200000;
create table mbansa001c.ref201501_nontarget as select * from (mytmptbl ) where target=0;
之后你可能想再次删除临时表。
答案 1 :(得分:0)
Hadoop是一个分布式计算框架。一些数据处理操作非常适合,因为它们是令人尴尬的平行"。某些数据处理操作不合适,因为它们无法分发。大多数现实案例介于两者之间。
我强烈怀疑您要做的是使用约 200k项目获取原始数据的样本。但是您的查询需要完全 200k项目 Hive最简单的方法是并行运行WHERE子句(在451+文件块上运行451 Mappers),然后将所有部分结果转储到单个" sink" (1 Reducer)允许前200k行通过并忽略其余行。但是所有记录都将被处理,甚至是那些被忽略的记录。
底线:你的采样器非常低效,结果可能会产生很大的偏差 - 较小的文件块将更快地映射并由Reducer更早地处理,因此更大的文件块几乎没有机会表示样本。
我猜你知道有多少记录符合WHERE子句,所以你最好使用某种随机抽样来检索大约。 500K或1M记录 - 可以在前面,在每个Mapper中完成 - 然后用LIMIT进行第二次查询,如果你真的想要任意数量的记录 - 单个Reducer将对于这种小卷来说还可以。
答案 2 :(得分:0)
确定。这对我有用。现在只需2-5分钟即可获得约2700万条记录:
创建表mb.ref201501_nontarget为SELECT * FROM adv.raf_201501 TABLESAMPLE(0.02 PERCENT)其中target = 0;
当使用limit或rand()时,它使用至少1个减速器,并且该过程需要超过2个小时,并且有点冻结,减少33%的步骤。
在没有限制的Tablesample中,它只分配了1个映射器和0个reducer。