2013-03-02 52 views
3

也許當您在標題中看到「語義錯誤」時,您認爲它是語法錯誤? 當然不是,我會告訴你發生了什麼事。Hive中的奇怪異常:語義分析中的錯誤

hive> use android; 
OK 
Time taken: 0.223 seconds 
hive> desc tb_user_basics; 
OK 
col_datetime string 
col_is_day_new string 
col_is_hour_new string 
col_ch string 
... 
p_date string 
p_hourmin string 
Time taken: 0.189 seconds 
hive> select count(distinct col_udid) from android.tb_user_basics where p_date>='20121001' and p_date<='20121231'; 
FAILED: Error in semantic analysis: org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timed out 
hive> 
> 
> select count(distinct col_udid) from android.tb_user_basics where p_date>='20121001' and p_date<='20121231'; 
FAILED: Error in semantic analysis: Unable to fetch table tb_user_basics 

我很肯定表中確實存在數據庫android。在第一個語句失敗後,似乎缺少表(即使我在表名中添加了數據庫前綴)

我想知道是否因爲數據量很大,也許你已經注意到了時間範圍是[20121001,20121231]。 我很多次運行該命令,總是引發這個錯誤。但是如果我將這個關聯改爲「p_date ='20121001'」,那麼這個語句可以正常運行。 (因爲體積較小?)

我期待你的答案,謝謝。

回答

1

可能你處於嚴格模式。嚴格模式特性之一是必須指定分區,所以這就是爲什麼在其中原因正在工作的情況下使用「p_date ='20121001'」的查詢。

請嘗試非嚴格模式:

set hive.mapred.mode=nonstrict; 
+0

沒關係,我會檢查該參數。 但實際上,如果我指定的時間範圍較小,如[20121001,20121005],則該聲明有效。 – HaiWang 2013-03-03 03:04:34

+0

你累了嗎? – www 2013-03-03 08:05:40

+0

我已經檢查過該參數,但它已經是非嚴格的了。我們沒有改變它,所以它仍然是默認值。 – HaiWang 2013-03-04 06:29:19