2016-05-31 30 views
0

我對Hive UNION ALL規範有疑問。Hive必須使用UNION ALL指定實際數據源(FROM)

此查詢是有效的Hive查詢。

SELECT 
    1 as id, 
    'Tom' as name 

此作業將按預期返回正確的一條記錄結果。

+----------+----------------+ 
| id |  name  | 
+----------+----------------+ 
|  1 |  Tom  | 
+----------+----------------+ 

但是,當這個查詢與UNION ALL一起提交時,我面臨一個問題。

SELECT 
    id, 
    name 
FROM 
    members 
UNION ALL 
SELECT 
    1 as id, 
    'Tom' as name, 

此SQL產生Error: java.lang.IllegalArgumentException: Can not create a Path from an empty string異常。我發現UNION ALL的所有子查詢必須具有FROM的實際數據源。例如,上面的查詢可以像下面重寫一樣按預期工作。

SELECT 
    id, 
    name 
FROM 
    members 
UNION ALL 
SELECT 
    1 as id, 
'Tom' as name 
FROM (
    SELECT COUNT(1) FROM members 
) t 

這是SQL或Hive的規範嗎?如果沒有FROM子句,我們不能運行查詢嗎?或者這是Hive本身的錯誤? 我使用的Hive版本是0.13,Hadoop 2.4。

回答

1

全部SELECT聲明需要FROM條款。

即使你的第一個查詢SELECT 1 as id, 'Tom' as name給出錯誤,如下圖所示:enter image description here

然而,如果我們運行SELECT 1 as id, 'Tom' as name FROM table1其中table1是我的數據庫中的表,那麼我們有結果如下: enter image description here

因此以上兩個查詢證明在所有SELECT聲明中都需要FROM子句。

沒關係UNION ALL或其他什麼。

這是Hive數據庫的功能。

我希望這可以幫助你!

+0

感謝您的評論。但在我的環境中,上面的查詢成功了。你使用了哪個版本?選擇1作爲ID,'tom'作爲名字; OK tom 已用時間:22.205秒,獲取:1行''' –

+0

我正在使用Hive 1.2.x,您使用的是哪個版本? – Farooque

+0

我正在使用0.13,HDP2。 –