使用0.11.0版。我在尝试执行此查询时得到不正确的结果
select t1.symbol, max(t1.maxts - t1.orderts) as diff from
(select catid, symbol, max(cast(timestamp as double)*1000) as maxts, min(cast(timestamp as double)*1000) as orderts, count(*) as cnt
from cat where recordtype in (0,1) and customerid=srcrepid group by symbol, catid) t1
where t1.cnt > 1
group by t1.symbol;
如您所见,有一个子查询带有GROUPBY语句。此子查询计算每个myid和符号的时间戳值的最大值和最小值。
现在,我有24个符号。在外部查询中,我想找到每个符号的最大差异,因此我按符号分组。
问题是现在返回864个结果行。Hive似乎没能把最后的结果变成我所期望看到的。
这是虫子吗?有人能复制这个吗?我有6个节点,每个节点运行4个符号。
使用的表格:
create table cat(CATID bigint, CUSTOMERID int, FILLPRICE double, FILLSIZE int, INSTRUMENTTYPE int, ORDERACTION int, ORDERSTATUS int, ORDERTYPE int, ORDID string, PRICE double, RECORDTYPE int, SIZE int, SRCORDID string, SRCREPID int, TIMESTAMP timestamp) PARTITIONED BY (SYMBOL string, REPID int) row format delimited fields terminated by ',' stored as ORC;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
hive.exec.max.dynamic.partitions.pernode=1000;
已编辑:已编辑,因为查询与实际使用的表不一致,因此很难提供任何帮助。。。
3条答案
按热度按时间j0pj023g1#
我已经看到,如果你引入orderby子句,它会在第一个groupby强制hive进入两个mr jobs之后给出正确的结果。
按要求添加查询修改作为示例。
选择t1.symbol,max(t1.maxts-t1.orderts)作为diff from(选择catid,symbol,max(cast(timestamp as double)*1000)作为maxts,min(cast(timestamp as double)1000)作为orderts,count()作为cnt from cat where recordtype in(0,1)and customerid=srcrepid group by symbol,catid order by symbol,catid)t1其中t1.cnt>1 group by t1.symbol;
但是是的,这仍然只是一个解决问题的工作,但是真正的问题是hive在查询中使用了错误的分区字段,它应该只使用symbol,但是如果您看到解释,它同时使用symbol和catid,这会导致它给出多个结果。
添加orderbyforceshive以另一个mr任务执行第二组by,从而得到正确的结果。
t0ybt7op2#
我认为,如果在外部查询中,您将其构造为:
选择t1.symbol,max(t1.maxts)-min(t1.orderts)作为diff。。。。
ar7v8xwq3#
正如yin在hive邮件列表中所解释的,这是一个与这个bug相关的bug。
当配置单元只使用一个mapreduce作业时,将使用两个分区列,而我的查询只希望按符号分组。
显然这个错误已经在后备箱里解决了。
下面是另一个bug报告,它更清楚地说明了这个问题