分区表上的Hive中的Group By给出重复的结果行

时间:2013-09-15 12:32:23

标签: hadoop group-by hive hiveql

使用版本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;

如您所见,有一个带有group by语句的子查询。此子查询计算每个MYID和SYMBOL的时间戳值的最大值和最小值。

现在,我有24个符号。在外部查询中,我想找到每个SYMBOL的最大差异,因此我按SYMBOL分组。

问题是这会立即返回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 个答案:

答案 0 :(得分:1)

正如Yin关于配置单mail list所解释的,这是与此bug相关的错误。

当Hive仅使用单个mapreduce作业时,将使用两个分区列,而我的查询只想按符号分组。

显然这个bug已在trunk中修复。

这是另一个bug report,可以更清楚地证明问题

答案 1 :(得分:0)

我认为如果在外部查询中你将它构造成这样可能会有用:

SELECT t1.symbol,max(t1.maxts) - min(t1.orderts)AS diff,....

答案 2 :(得分:0)

我已经看到,如果你引入一个ORDER BY子句,它会在第一个GROUP BY强制hive进入两个MR作业之后,并给出正确的结果。

根据要求添加查询修改作为示例。

选择t1.symbol,max(t1.maxts - t1.orderts)作为差异     (选择catid,symbol,max(cast(timestamp as double)* 1000)作为maxts,min(cast(timestamp as double) 1000)作为orderts,count()作为cnt         from cat其中recordtype in(0,1)and customerid = srcrepid group by symbol,catid ORDER BY symbol,catid )t1 其中t1.cnt> 1 由t1.symbol组成;

但是,这仍然只是围绕这个问题的解决方法,但真正的问题是Hive在该查询中使用了错误的分区字段,它应该只使用了符号但是如果你看到它的解释它同时使用符号和catid这会导致它产生多重结果。

添加ORDER BY会强制Hive在不同的MR作业中执行第二组,从而为我们提供正确的结果。