Sql 我们如何替换配置单元变量的值以检查是否存在任何错误

Sql 我们如何替换配置单元变量的值以检查是否存在任何错误,sql,hadoop,hive,hiveql,Sql,Hadoop,Hive,Hiveql,我们有一个查询,其中定义了50多个变量 我们通过shell脚本调用这个hql,大多数时候我都会遇到语法问题,因为我没有在查询中正确定义配置单元变量 Example set hive var0=value0; set hive var1=value1; set hive var2=value2; select * from ${hiveconf:var0} where col1=${hiveconf:var1} and col2=${hiveconf:var2}; 我想在替换配置单元变量后检查

我们有一个查询,其中定义了50多个变量

我们通过shell脚本调用这个hql,大多数时候我都会遇到语法问题,因为我没有在查询中正确定义配置单元变量

Example
set hive var0=value0;
set hive var1=value1;
set hive var2=value2;

select * from ${hiveconf:var0} where col1=${hiveconf:var1} and col2=${hiveconf:var2};
我想在替换配置单元变量后检查上面的查询结果, 那么,有没有一种方法可以检查变量的解析方式是否正确,或者是否存在语法错误


请让我知道任何替代方案。

最好使用
hivevar
命名空间

您可以使用
打印所有变量!echo
命令:

set hivevar:var0=value0;
hive> ! echo  Variable hivevar:var0 is ${hivevar:var0};
结果:

Variable hivevar:var0 is value0
还可以使用
explain extended
-它将打印带有谓词的详细查询计划,如果是语法错误,则会失败

更新: 此外,如果
Hive.fetch.task.conversion
设置为
more
minimal
,您也可以使用SELECT执行相同的操作,并且Hive可以执行简单查询,而无需启动MR。如果您使用的是Qubole,请将
限制1
添加到查询中:

 set hive.fetch.task.conversion=more; 
 select 'Variable hivevar:var0 is', '${hivevar:var0}' limit 1;
为什么您可能需要使用SELECT执行此操作?例如,使用铸造或一些自定义项轻松检查参数。如果需要检查参数的类型是否为
DATE
,请使用

 set hive.fetch.task.conversion=more; 
 select 'Variable hivevar:var0 is', date '${hivevar:var0}' limit 1;

在这种情况下,如果
${hivevar:var0}
不是日期,则将引发类型转换异常并终止脚本执行。

最好使用
hivevar
命名空间

您可以使用
打印所有变量!echo
命令:

set hivevar:var0=value0;
hive> ! echo  Variable hivevar:var0 is ${hivevar:var0};
结果:

Variable hivevar:var0 is value0
还可以使用
explain extended
-它将打印带有谓词的详细查询计划,如果是语法错误,则会失败

更新: 此外,如果
Hive.fetch.task.conversion
设置为
more
minimal
,您也可以使用SELECT执行相同的操作,并且Hive可以执行简单查询,而无需启动MR。如果您使用的是Qubole,请将
限制1
添加到查询中:

 set hive.fetch.task.conversion=more; 
 select 'Variable hivevar:var0 is', '${hivevar:var0}' limit 1;
为什么您可能需要使用SELECT执行此操作?例如,使用铸造或一些自定义项轻松检查参数。如果需要检查参数的类型是否为
DATE
,请使用

 set hive.fetch.task.conversion=more; 
 select 'Variable hivevar:var0 is', date '${hivevar:var0}' limit 1;

在这种情况下,如果
${hivevar:var0}
不是日期,则将引发类型转换异常并终止脚本执行。

与hivevar命名空间一起,我们可以使用另一个属性hive.root.logger=INFO,控制台

这将在替换变量值后显示查询,从中我们可以发现问题

 cat test.hql
set hivevar:var1=${hivevar:var11};
set hivevar:var2=2345;

select ${hivevar:var11};
select ${hivevar:var2};
配置单元命令--
hive--hiveconf-hive.root.logger=INFO,控制台--hivevar-var11=1234-f-test.hql

控制台上的输出

select 1234
2018-10-17T08:23:31,632  INFO [main] ql.Driver: Completed executing command(queryId=-4dd6-493f-88be-03810f847fe7); Time taken: 0.003 seconds
OK
2018-10-17T08:23:31,632  INFO [main] ql.Driver: OK
2018-10-17T08:23:31,670  INFO [main] io.NullRowsInputFormat$NullRowsRecordReader: Using null rows input format
1234

除了hivevar命名空间之外,我们还可以使用另一个属性hive.root.logger=INFO,控制台

这将在替换变量值后显示查询,从中我们可以发现问题

 cat test.hql
set hivevar:var1=${hivevar:var11};
set hivevar:var2=2345;

select ${hivevar:var11};
select ${hivevar:var2};
配置单元命令--
hive--hiveconf-hive.root.logger=INFO,控制台--hivevar-var11=1234-f-test.hql

控制台上的输出

select 1234
2018-10-17T08:23:31,632  INFO [main] ql.Driver: Completed executing command(queryId=-4dd6-493f-88be-03810f847fe7); Time taken: 0.003 seconds
OK
2018-10-17T08:23:31,632  INFO [main] ql.Driver: OK
2018-10-17T08:23:31,670  INFO [main] io.NullRowsInputFormat$NullRowsRecordReader: Using null rows input format
1234