蜂巢计数和计数不同不正确

Posted

技术标签:

【中文标题】蜂巢计数和计数不同不正确【英文标题】:hive count and count distinct not correct 【发布时间】:2014-02-14 11:27:23 【问题描述】:

我在 Hive 中有一个有 20 列的表,我想计算唯一记录和每小时的所有记录。

表格如下:

CREATE EXTERNAL TABLE test1(
  log_date string, 
  advertiser_creatives_id string, 
  cookieID string, 
) 
STORED AS ORC
LOCATION "/day1orc"
tblproperties ("orc.compress"="ZLIB");

我的查询是这样的:

SELECT Hour(log_date), 
       Count(DISTINCT cookieid) AS UNIQUE, 
       Count(1)                 AS impressions 
FROM   test1 
GROUP  BY Hour(log_date); 

但结果不正确。我有大约 7000 万个条目,当我进行总印象数时,我只得到大约 800 万个,所以我怀疑 distinct 占用了太多列。

那么我该如何解决这个问题,以便获得正确的展示次数?

** 额外信息**

hive.vectorized.execution.enabled 未定义,因此未激活。

TEXT 格式的相同查询返回的行数更少(约 270 万)

COUNT(*) 的结果:70643229

COUNT(cookieID) 的结果:70643229

COUNT(DISTINCT cookieID) 的结果:1440195

干杯

【问题讨论】:

Hive 0.11 还是 Hive 0.12 ?是否可以共享重现问题的数据文件? Hive 0.12 和数据不是我要分享的,但所有的总和并没有加起来。 7000 万条记录,但当我算上它时,我只得到 800 万条记录。 你能发布查询的解释吗?您没有启用矢量化 (set hive.vectorized.execution.enabled=true;),是吗? 另外,你能张贴检查COUNT(*)COUNT(cookieID)。另外,如果可能的话,您能否尝试使用任何其他格式(不是 ORC)的相同数据,并回发差异(如果有)? 在我的帖子中添加了额外的信息 :) 【参考方案1】:

我有一个例子,可能对你有用。我认为你的“行格式分隔字段终止”有一些问题。 我有一个文本,用“\t”分隔,如下所示:

id    date      value
1   01-01-2014  10
1   03-01-2014  05
1   07-01-2014  40
1   05-01-2014  20
2   05-01-2014  10

但我只创建了一个有 2 列的表,如下所示:

use tmp ;
create table sw_test(id string,td string) row format delimited fields terminated by '\t' ;
LOAD DATA LOCAL INPATH '/home/hadoop/b.txt' INTO TABLE sw_test;

你觉得“select td from sw_test;”的结果如何

不是

td
01-01-2014  10
03-01-2014  05
07-01-2014  40
05-01-2014  20
05-01-2014  10

但是

td
01-01-2014
03-01-2014
07-01-2014
05-01-2014
05-01-2014

所以,我认为你的 cookie 包含一些特殊的列,包括你定义的分隔符。 我希望这可以帮助你。 祝你好运!

【讨论】:

以上是关于蜂巢计数和计数不同不正确的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Mongo Spark 连接器为查询返回不同且不正确的计数?

蜂巢计数查询无法完成它永远运行

比较两个蜂巢表之间的计数

为啥在使用“.count”返回 Swift 下标计数时收到不正确的数组计数?

是否有任何其他选项可以从表中获取总计数和同一查询中列的不同计数?

MS 访问计数不同的多列