我有许多SQL查询使用一组通用的参数(变量)。当前,参数是set
在每个文件的顶部。当任何参数更改时,必须在每个文件中更改它。能够将参数保存在单独的文件中并且仅在一个位置进行更改将是有益的。
这如何完成?
我意识到我可以在--var
中使用impala-shell
选项,但这意味着必须多次输入。
我可以看到这种可能发生的几种方式:
impala-shell
可能支持多个-f
参数:这会很优雅,但事实并非如此。
可以将查询cat
组合在一起并通过管道传输到impala-shell
中。这是可行的,但不雅致。
可以为指定impala-shell
自变量的--var
设置别名。这可能很难解决。
显然#1是最好的解决方案,但是还有其他选择或建议吗?
答案 0 :(得分:1)
请查看Impala文档: https://www.cloudera.com/documentation/enterprise/5-15-x/topics/impala_shell_options.html#shell_options
在此处粘贴相关部分:
-f query_file或--query_file = query_file
从文件传递SQL查询。多个语句必须为分号 (;)定界。在CDH 5.5 / Impala 2.3及更高版本中,您可以指定一个 文件名-代表标准输入。此功能使其 方便将impala-shell用作Unix管道的一部分,其中SQL 语句是由其他工具动态生成的。
如您所见,Impala可以解析更多以分号(;)分隔的查询文件。这样,使用--var参数就可以完成第一种情况。
答案 1 :(得分:0)
3a。。从配置文件自动生成--var
命令行参数。
尝试此bash功能...
function impala-with-conf {
if [[ -z "$1" || ! -r "$1" ]] ; then
echo "1st argument must be a properties file" >&2
return 1
fi
typeset AllVarArgs=''
while IFS='' read -r Line || [[ -n "$Line" ]]; do
KeyValue=$(echo "$Line" | sed -e 's/^[ \t]*//' -e 's/[ \t]*=[ \t]*/=/' -e 's/[ \t]*$//')
AllVarArgs="$AllVarArgs --var $KeyValue"
done < "$1"
shift
impala-shell $AllVarArgs $@
}
(基于Read a file line by line assigning the value to a variable)
将使用“属性”文件,例如
alpha_beta = some-text-without-spaces-or-quotes
epsilon=12
演示:
cat x.sql
select '${VAR:alpha_beta}' as ab , ${VAR:epsilon} as e
impala-with-conf x.conf -q x.sql
Query: select 'some-text-without-spaces-or-quotes' as ab , 12 as e
+------------------------------------+----+
| ab | e |
+------------------------------------+----+
| some-text-without-spaces-or-quotes | 12 |
+------------------------------------+----+