0

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

已编辑:已编辑,因为查询与使用的实际表不一致,因此很难提供任何帮助...

4

3 回答 3

1

正如 Yin 在 hive邮件列表中所解释的,这是一个与此错误相关的错误

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

显然,此错误已在主干中修复。

这是另一个错误报告,更清楚地说明了问题

于 2013-09-17T06:27:55.647 回答
0

我认为如果在外部查询中将其结构化,它可能会起作用:

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

于 2013-09-15T22:26:09.117 回答
0

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

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

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 ORDER BY symbol, catid ) t1 where t1.cnt > 1 group by t1.symbol;

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

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

于 2014-06-03T23:01:07.520 回答