在HIVE查询中设置变量

时间:2016-04-15 23:56:14

标签: hadoop hive quantile

我正在尝试按照帖子here在我的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:tile数量必须是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

思想?

1 个答案:

答案 0 :(得分:0)

如果没有记录的方式,可以使用记录的功能来提供足够干净的黑客攻击:)

这是我的尝试,使用来自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,因为'source'只在本地磁盘上运行...

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;