2016-07-27 55 views
2

看看這些。Hive通過'distinct'子句給出記錄,但'count'爲0

0: jdbc:hive2> select distinct A_COL from A_TABLE where A_COL='1999-05-04'; 
+-------------+--+ 
| A_COL | 
+-------------+--+ 
| 1999-05-04 | 
+-------------+--+ 
1 row selected (6.127 seconds) 

0: jdbc:hive2> select count(*) from A_TABLE where A_COL='1999-05-04'; 
+------+--+ 
| _c0 | 
+------+--+ 
| 0 | 
+------+--+ 
1 row selected (4.206 seconds) 

0: jdbc:hive2> select * from A_TABLE where A_COL='1999-05-04'; 
+-------+--------------- 
| A_COL | blabla... 
+-------+---------- 
+-------+---------- 
No rows selected (0.292 seconds) 

我覺得第一個查詢的意思是「至少一個記錄,其A_COL的值是‘1999年5月4日’存在。」​​
但第二個和第三個查詢否認。

怎麼可能?

+0

這表明底層數據正在改變。這些查詢結果不應該發生在靜態數據庫上。 –

+0

您是否認爲運行時間的差異可能很大?它幾乎就好像前兩個查詢確實做了一些事情,而第三個查詢並沒有打擾。 –

+0

'show partitions A_TABLE' - 這是什麼輸出? –

回答

1

我不知道你的表是否有分區A_COL或不是,但可以是這種情況。所以不同的是顯示分區值,但表中沒有實際數據:

hive> CREATE TABLE test_2(B_COL string) PARTITIONED BY (A_COL string); 
OK 
Time taken: 1.182 seconds 

hive> ALTER TABLE test_2 ADD PARTITION (A_COL='2016-07-27'); 
OK 
Time taken: 0.285 seconds 

hive> select count(*) from test_2 where A_COL='2016-07-27'; 
OK 
0 
Time taken: 35.016 seconds, Fetched: 1 row(s) 

hive> select * from test_2 where A_COL='2016-07-27'; 
OK 
Time taken: 0.165 seconds 

hive> select distinct(A_COL) from test_2; 
2016-07-27 
Time taken: 24.528 seconds, Fetched: 1 row(s) 
+0

你是對的!該分區存在(沒有實際數據)。 (但這是HIVE預期的行爲?這看起來非常有線。) – plhn

+0

沒有關於它的文檔,但是 - [HIVE-3108](https://issues.apache.org/jira/browse/HIVE-3108?focusedCommentId = 13402814&page = com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13402814)和[HIVE-2955](https://issues.apache.org/jira/browse/HIVE-2955) - 那裏可以是其他類似主題的門票。 –