[英]Set variables in HIVE query
我正在嘗試按照此處的文章在 Hive查詢中設置變量。 假設我在hdfs中有以下文件:
Berg,12000
Faviet,9000
Chen,8200
Urman,7800
Sciarra,7700
Popp,6900
Paino,8790
然后,我在數據之上創建了架構,如下所示:
CREATE EXTERNAL TABLE IF NOT EXISTS employees (lname STRING, salary INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/home/hduser/test/';
我想為表格創建4個圖塊,但我不想硬編碼圖塊的數量,而是想將其作為變量傳遞。 我的代碼如下:
SET q1=select ceiling(count(*)/2) from employees;
SELECT lname,
salary,
NTILE(${hiveconf:q1}) OVER (
ORDER BY salary DESC) AS quartile
FROM employees;
但是,這將引發錯誤:
失敗:SemanticException無法將窗口調用分解為組。 至少一組必須僅取決於輸入列。 還要檢查循環依賴性。 潛在錯誤:org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException:切片數必須為int表達式
我試圖在調用變量時使用引號,例如'${hiveconf:q1}'
,但這似乎無濟於事。 如果我對磁貼的數量進行硬編碼(這是我要避免的),則工作流程將如下所示:
SELECT lname,
salary,
NTILE(4) OVER (
ORDER BY salary DESC) AS quartile
FROM employees;
產生
Berg 12000 1
Faviet 9000 1
Paino 8790 2
Chen 8200 2
Urman 7800 3
Sciarra 7700 3
Popp 6900 4
有什么想法嗎?
如果沒有記錄的方法,則可以使用記錄的功能來提供足夠干凈的技巧:)
這是我的嘗試,使用來自hive的dfs命令,來自hive的shell命令,source-command和不包含的命令。 我想它可能無法通過Hiveserver2進行開箱即用。 如果有更漂亮的方法我會很高興
我們走吧
基本設定
SET EMPLOYEE_TABLE_LOCATION=/home/hduser/test/;
CREATE EXTERNAL TABLE IF NOT EXISTS employees (lname STRING, salary INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '${hiveconf:EMPLOYEE_TABLE_LOCATION}';
SET PATH_TO_SETTINGS_FILE=hdfs:/tmp/query_to_setting;
SET FILENAME_ON_LOCAL_FS=query_to_setting.sql;
在hdfs中生成文件
內容為"SET q1=<the-query-result>;"
CREATE TABLE query_to_setting_table
LOCATION '${hiveconf:PATH_TO_SETTINGS_FILE}'
AS
SELECT concat('SET q1=', ceiling(count(*)/2),'\;') from employees;
生成的文件中的源作為任何sql文件。
首先將文件放入本地fs,因為“源”僅在本地磁盤上運行...
dfs -get ${hiveconf:PATH_TO_SETTINGS_FILE}/000000_0 ${hiveconf:FILENAME_ON_LOCAL_FS};
source ${hiveconf:FILENAME_ON_LOCAL_FS};
嘗試設置
hive> SET q1;
q1=4
在查詢中使用設置
hive > SELECT lname,
salary,
NTILE( ${hiveconf:q1}) OVER (
ORDER BY salary DESC) AS quartile
FROM employees;
OK
Berg 12000 1
Faviet 9000 1
Paino 8790 2
Chen 8200 2
Urman 7800 3
Sciarra 7700 3
Popp 6900 4
可選清理
!rm ${hiveconf:FILENAME_ON_LOCAL_FS};
DROP TABLE query_to_setting_table;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.