Hadoop 在配置单元查询中设置变量
我正试图跟随帖子在我的配置单元查询中设置一个变量。假设我在hdfs中有以下文件: /home/hduser/test/hr.txt 然后,我在数据之上创建了模式,如下所示:Hadoop 在配置单元查询中设置变量,hadoop,hive,quantile,Hadoop,Hive,Quantile,我正试图跟随帖子在我的配置单元查询中设置一个变量。假设我在hdfs中有以下文件: /home/hduser/test/hr.txt 然后,我在数据之上创建了模式,如下所示: CREATE EXTERNAL TABLE IF NOT EXISTS employees (lname STRING, salary INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/home/hduser/test/'; 我想为表创建4个平铺,
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无法将窗口调用拆分为组。至少有1个组必须仅依赖于输入列。还要检查循环依赖关系。
基本错误:org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException:平铺数必须是整数表达式
我试图在调用变量时使用引号,如在'${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
想法?当没有文档化的方法时,可以使用文档化的功能提供足够干净的破解:) 下面是我的尝试,使用配置单元中的dfs命令、配置单元中的shell命令、源命令等等。我想它可能无法通过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中生成文件
内容为“设置q1=;”
将源代码作为任何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;
设置变量时,尝试在
select…
子句周围使用单引号。我在谷歌上搜索了很多次,蜂巢变量的功能非常有限——基本上是宏。我会考虑重新思考如何使用SQL完成你的目标。
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;