Hadoop 在配置单元查询中设置变量

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个平铺,

我正试图跟随帖子在我的配置单元查询中设置一个变量。假设我在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个平铺,但我不想硬编码平铺的数量,而是想将其作为变量传入。我的代码如下:

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;