3 回答

TA貢獻2039條經(jīng)驗 獲得超8個贊
您需要使用特殊的hiveconf進行變量替換。例如
hive> set CURRENT_DATE='2012-09-16';
hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'
同樣,你可以傳遞命令行:
% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql
請注意,還有env和系統(tǒng)變量,因此您可以參考${env:USER}例如。
要查看所有可用變量,請從命令行運行
% hive -e 'set;'
或者從蜂巢提示符運行
hive> set;
更新: 我也開始使用hivevar變量,將它們放入hql片段中我可以使用source命令從hive CLI中包含(或從命令行傳遞-i選項)。這里的好處是,變量可以在有或沒有hivevar前綴的情況下使用,并允許類似于全局和本地使用的東西。
所以,假設(shè)有一些setup.hql設(shè)置一個tablename變量:
set hivevar:tablename=mytable;
然后,我可以帶入蜂巢:
hive> source /path/to/setup.hql;
并在查詢中使用:
hive> select * from ${tablename}
要么
hive> select * from ${hivevar:tablename}
我還可以設(shè)置一個“本地”表名,這會影響$ {tablename}的使用,但不會影響$ {hivevar:tablename}
hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'
VS
hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'
從CLI可能并不意味著太多,但可以在使用source的文件中使用hql ,但是在本地的其余部分中設(shè)置一些“本地”變量。

TA貢獻1853條經(jīng)驗 獲得超18個贊
這里的大多數(shù)答案都建議使用hiveconf或hivevar命名空間來存儲變量。所有這些答案都是正確的。但是,還有一個命名空間。
有三個namespaces可用于保留變量。
hiveconf - hive 從此開始,所有hive配置都存儲為此conf的一部分。最初,變量替換不是蜂巢的一部分,當(dāng)它被引入時,所有用戶定義的變量也作為其一部分存儲。這絕對不是一個好主意。因此創(chuàng)建了兩個名稱空間。
hivevar:存儲用戶變量
system:存儲系統(tǒng)變量。
因此,如果您將變量存儲為查詢的一部分(即date或product_number),則應(yīng)使用hivevar命名空間而不是hiveconf命名空間。
這就是它的工作原理。
hiveconf仍然是默認命名空間,因此如果您不提供任何命名空間,它會將您的變量存儲在hiveconf命名空間中。
但是,當(dāng)涉及引用變量時,情況并非如此。默認情況下,它指的是hivevar名稱空間。令人困惑,對吧?通過以下示例可以更清楚。
如果您沒有提供如下所述的命名空間,則變量var將存儲在hiveconf命名空間中。
set var="default_namespace";
因此,要訪問它,您需要指定 hiveconf名稱空間
select ${hiveconf:var};
如果你不提供命名空間,它會給你一個錯誤,如下所述,原因是默認情況下,如果你試圖訪問它只在hivevar命名空間中檢查的變量。并且hivevar沒有名為變量的變量var
select ${var};
我們已明確提供hivevar名稱空間
set hivevar:var="hivevar_namespace";
因為我們提供命名空間,這將起作用。
select ${hivevar:var};
默認情況下,在引用變量時使用的工作空間hivevar也是如此。
select ${var};
添加回答
舉報