我正在尝试按照帖子here在我的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: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
思想?
答案 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;