Hadoop - 在查询中声明变量时出现错误消息

时间:2015-09-23 22:11:40

标签: hadoop hive

我在HUE的Beeswax查询编辑器中尝试了以下查询:

SET MAXDATE=(SELECT MAX(DATA_DAY) FROM DB1.DESTINATION_TABLE);

SELECT COUNT(*) FROM DB2.SOURCE_TABLE

WHERE YEAR(DATA_DAY) >= '2015'
AND DATA_DAY > ${HIVECONF:MAXDATE};

此查询不会运行并产生以下错误消息:

  

失败:ParseException第1:4行在'MAXDATE'附近的'MAXDATE'处缺少KW_ROLE第1行第11行在'='''附近缺少EOF

有关问题的建议吗?我不明白KW_ROLE消息的含义。

我来自SQL Server后台,只会在SQL Server中运行以下内容,但我正在尝试找到功能相似的Hadoop / Hive。

SELECT COUNT(*) FROM DB2.SOURCE_TABLE

WHERE YEAR(DATA_DAY) >= '2015'

AND DATA_DAY > (SELECT MAX(DATA_DAY) FROM DB1.DESTINATION_TABLE)

2 个答案:

答案 0 :(得分:2)

您尝试过的查询包含语法问题。 HiveConf应该用单引号括起来。

SET MAXDATE=(SELECT MAX(DATA_DAY) FROM DB1.DESTINATION_TABLE);

SELECT COUNT(*) FROM DB2.SOURCE_TABLE

WHERE YEAR(DATA_DAY) >= '2015'
AND DATA_DAY > '${HIVECONF:MAXDATE}';

答案 1 :(得分:0)

据我所知,hive也支持以下语法。

SELECT COUNT(*) FROM DB2.SOURCE_TABLE a

JOIN 

(SELECT MAX(DATA_DAY) AS max_date FROM DB1.DESTINATION_TABLE) b

WHERE YEAR(a.DATA_DAY) >= '2015'

AND a.DATA_DAY > b.max_date;

但如果DB1.DESTINATION_TABLE上有一堆数据,那么这不是一个好的实现。

在这种情况下,每个查询都会在SELECT MAX(DATA_DAY) FROM DB1.DESTINATION_TABLE中执行大量子查询。

如果可能,您可以将SELECT MAX(DATA_DAY) FROM DB1.DESTINATION_TABLE结果存储在另一个表中,可能是Max_table

然后sql会是这样的:

SELECT COUNT(*) FROM DB2.SOURCE_TABLE

JOIN Max_table

WHERE YEAR(DB2.SOURCE_TABLE.DATA_DAY) >= '2015' and 

DB2.SOURCE_TABLE.DATA_DAY > (Max_table.DATA_DAY)