簡體   English   中英

在HIVE查詢中設置變量

[英]Set variables in HIVE query

我正在嘗試按照此處的文章 Hive查詢中設置變量。 假設我在hdfs中有以下文件:

/home/hduser/test/hr.txt

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM