有没有办法在单独的文件中设置查询参数(变量)?

时间:2018-09-28 20:08:53

标签: hadoop impala

我有许多SQL查询使用一组通用的参数(变量)。当前,参数是set每个文件的顶部。当任何参数更改时,必须在每个文件中更改它。能够将参数保存在单独的文件中并且仅在一个位置进行更改将是有益的。

这如何完成?

我意识到我可以在--var中使用impala-shell选项,但这意味着必须多次输入。

我可以看到这种可能发生的几种方式:

  1. impala-shell可能支持多个-f参数:这会很优雅,但事实并非如此。

  2. 可以将查询cat组合在一起并通过管道传输到impala-shell中。这是可行的,但不雅致。

  3. 可以为指定impala-shell自变量的--var设置别名。这可能很难解决。

显然#1是最好的解决方案,但是还有其他选择或建议吗?

不太相关:Multiple query execution in cloudera impala

2 个答案:

答案 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 |
+------------------------------------+----+