Sql 我们如何替换配置单元变量的值以检查是否存在任何错误
我们有一个查询,其中定义了50多个变量 我们通过shell脚本调用这个hql,大多数时候我都会遇到语法问题,因为我没有在查询中正确定义配置单元变量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}; 我想在替换配置单元变量后检查
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