【问题标题】:converting list into array for values stored in a variable将列表转换为存储在变量中的值的数组
【发布时间】:2021-09-06 07:30:02
【问题描述】:

我有一个配置文件。第一列是作业名称,其余列是与该作业关联的表。现在我正在阅读第一行。它将在 .现在我想循环这些表并创建一个 HQL 查询。我的代码的问题是表作为列表存储在变量中,当我执行 unset 命令时,它会抛出错误。任何人都可以帮助我哪里出错了。下面是配置文件、代码和所需的输出。

job1,tbl1,tbl2,tbl3
job2.tbl4,tbl5,tbl6
job3,tbl7,tbl8,tbl9

下面是我正在尝试的代码

    #!/bin/bash

while read line; do
    job_name=$(echo "$line"|awk 'BEGIN{FS=","}{print $1}')
    echo "JobName is $job_name"
    tablestring=${line#"$job_name"}
    for table in ${tablestring//,/ }; do
        echo "$table"
    done
hql="select $table as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.$table "
unset tablestring[0]
for tbl in "${tablestring[@]}"
do
hql+=$'\n'
hql+="union all select $tbl as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.$tbl"
hql+=";"
echo "$hql" >query.hql
done
done < a.configuration

以下是我希望在第一次迭代中为作业 1 以及随后为作业 2 实现的所需输出,依此类推..

  select tbl1 as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.tbl1
    union all select tbl2 as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.tbl2
    union all select tbl3 as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.tbl3;

【问题讨论】:

  • 好吧,“tablestring”不是这个脚本中的数组。问题:您控制/编写配置文件还是由另一个进程生成?,您对 query.hql 的期望是什么……只有一个选择语句(因此每个作业 1 个文件)或所有作业的所有选择语句?最后,除了脚本运行时的显示之外,您似乎没有使用作业名称......我是对的吗?
  • @AndreGelinas .. 我写了配置.. 是正确的.. 为每个作业单独的 query.hql .. 将执行 hql 文件并将其删除.. 稍后需要生成另一个 query.hql对于具有所需表的另一个作业..作业名称仅用于显示

标签: linux shell unix hive scripting


【解决方案1】:

所以我会用这个作为配置文件a.cfg

job[1]="jobname1 tbl1 tbl2 tbl3"
job[2]="jobname2 tbl4 tbl5 tbl6 tbl7"
job[3]="jobname3 tbl8 tbl9"

还有这个脚本

#!/bin/bash

TimeStamp=$(date +"%Y%m%d%H%M%S")

#Sourcing the configuration file. Here in the same directory as this script but you can provide the full path
. ./a.cfg

for i in ${!job[@]}; do
    #Creating the array jobtable. The job name is always index 0
    jobtable=( ${job[$i]} )
    #Using a unique name for each file
    filename=${TimeStamp}_${jobtable[0]}.hql
    echo "Processing ${jobtable[0]} using"
    for ((j=1;j<${#jobtable[@]};j++)); do
        echo "    ${jobtable[$j]}"
        #Creating the hql file
        if [[ $j -eq 1 ]]; then
            echo "select ${jobtable[$j]} as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.${jobtable[$j]} " >> $filename
        elif [[ $j -lt $((${#jobtable[@]}-1)) ]]; then
            echo " union all select ${jobtable[$j]} as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.${jobtable[$j]}" >> $filename
        else
            echo " union all select ${jobtable[$j]} as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.${jobtable[$j]};" >> $filename
        fi
    done
    #You can use the newly created hql file here using $filename. I would not delete the file though as it might be usefull to
    #troubleshoot if something is not right.
done

它确实会生成像这样的 hql 文件

select tbl1 as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.tbl1
 union all select tbl2 as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.tbl2
 union all select tbl3 as table_name, max(cycle_Date) as AS_OF_dATE FROM DB1.tbl3;

编辑:小编辑以纠正错字。

【讨论】:

  • 感谢您的回答。我面临一个问题。我创建了完全相同的配置,但是在获取文件时,它抛出的权限被拒绝。我尝试通过在脚本中添加 chmod u+r+x a.configuration 然后 ../a.configuration 来更改它..我仍然收到权限被拒绝错误..我检查了文件属性并且所有访问权限都授予文件
  • 只是为了确定,在您的评论中它说“../a.configuration”有 2 个点而不是只有 1 个点。这是一个错字吗?因为这可能是权限被拒绝的来源。采购行是“../a.cfg”,前两个点之间有一个空格,只是为了清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2012-02-02
  • 1970-01-01
  • 2019-08-10
相关资源
最近更新 更多