代码之家  ›  专栏  ›  技术社区  ›  ctbrown

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

  •  0
  • ctbrown  · 技术社区  · 7 年前

    我有许多SQL查询使用一组公共参数(变量)。目前,参数为 set 在顶部 文件。任何参数更改时,都必须在每个文件中更改。如果能够将参数放在一个单独的文件中,并且只在一个地方进行更改,这将是有益的。

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

    我可以从几个方面看出 发生:

    1. 黑斑羚壳 可能支持多个 -f

    2. 查询可以是 cat 一起吹进 . 这是有用的,但不雅观。

    3. 可以为设置别名 黑斑羚壳 指定的 --变量

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

    不太相关: Multiple query execution in cloudera impala

    2 回复  |  直到 7 年前
        1
  •  1
  •   fzsombor    7 年前

    https://www.cloudera.com/documentation/enterprise/5-15-x/topics/impala_shell_options.html#shell_options

    在此处粘贴相关部分:

    (;) 分隔的。在CDH 5.5/Impala 2.3及更高版本中,可以指定 文件名-表示标准输入。这个特性使它 方便地将impala shell用作Unix管道的一部分,其中包含SQL

    如您所见,Impala可以解析更多的查询文件分号(;)分隔的。这样,使用--var参数就可以完成第一个案例。

        2
  •  0
  •   Samson Scharfrichter    7 年前

    自动生成 --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 |
    +------------------------------------+----+

    推荐文章