【问题标题】:shell script to pass element in a list over a sql query通过 sql 查询传递列表中的元素的 shell 脚本
【发布时间】:2021-09-04 00:06:11
【问题描述】:

我有一个参数 $tbl,其中包含表列表。例如 (tbl1 tbl2 tbl3)。 现在从我的 shell 脚本中,我正在运行如下配置单元查询。

hive -e " select min(column_name) from db.tbl1 
          union all select min(column_name) from db.tbl2 
          union all select min(column_name) from db.tbl3 " > a.txt

现在脚本中的列表可能会有所不同,即如果有时它是 3 个表,那么在下一次迭代中,该变量可能会存储 4 个表。任何人都可以建议如何对查询进行参数化,以便它将获取列表中的所有值并将其传递给 hive 查询。

【问题讨论】:

  • 在列表中的元素上循环,每个循环构建查询。查询完成后,调用hive
  • @Nic3500 嗨..我在下面使用。 for tbl in "${table[@]}" do echo "select min(column_name) from db.$tbl union all" > a.hql done .. 这个问题是最后一次 tbl 迭代也是打印 union all。我不想要最后一个联合,最后想要一个分号。谁能帮我解决这个问题。我是脚本新手

标签: linux shell unix hive scripting


【解决方案1】:

给你:

#!/bin/bash

table=(tbl1 tbl2 tbl3)

# The select takes the 1st table
sql="select min(column_name) from ${table[0]}"

# Remove 1st table
unset table[0]

# Add union statements
for T in ${table[@]}
do
    sql+=$'\n'
    sql+="union all select min(column_name) from db.$T"
done

sql+=";"

echo "$sql"

结果是:

select min(column_name) from tbl1 
union all select min(column_name) from db.tbl2 
union all select min(column_name) from db.tbl3;

  • 第一个表用于select
  • 一旦使用,就会从阵列中移除。
  • 然后循环其余表,以获取 union 语句。
  • 最后在末尾添加;

如果您的查询发生变化,您可以根据需要进行调整。

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 2018-02-26
    • 2011-02-25
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2013-01-10
    相关资源
    最近更新 更多