bash—将数据存储在变量中,并确保在传递给命令时不会对其进行解释

vcudknz3  于 2021-06-03  发布在  Sqoop
关注(0)|答案(0)|浏览(274)

我使用bash脚本启动一个sqoop,将oracle表卸载到hive。
我需要摄取的表在一个文件中显示,格式如下:

rdbSchema|rbdTable|hiveSchema|hiveTable|col_name|1|select * from rdbSchema.rbdTable where ....|col1='varchar(1000)',col2='decimal(10)',...

字段很清楚,我只想指出:
查询字段通常很长,还可以包含特殊字符,如()、'“
最后一列包含要在配置单元中使用的数据类型,并将包含特殊字符,如上面的示例所示
我正在使用awk将这一行分割成参数,以提供给sqoop,我希望/需要继续使用它。sqoop命令包含在函数中。我 cat 包含表的文件,通过管道将其传输到 xargs 它调用的函数将它传递给整行。然后,函数使用 awk 如下所示计算参数。我使用xargs,这样我就可以并行摄取。
比如看我走过的路 $query 我的剧本。我昨天遇到一个查询,其中包含selectcol1,(selectcol2from…)from(恕我直言,我不是dba)会被bash误传。就在昨天,一个查询也包含一个单引号。因为我被要求实现这个新的fild,我事先就知道它会把chars搞得一团糟(因为它肯定包含单引号、双引号和括号),所以我想知道如何正确地处理它
这就是我如何分配我的价值观:

wtf=$1
local origSchema=$(echo "$wtf" | awk -F"|" '{print $1}')
local origTable=$(echo "$wtf" | awk -F"|" '{print $2}')
local hiveSchema=$(echo "$wtf" | awk -F"|" '{print $3}')
local hiveTable=$(echo "$wtf" | awk -F"|" '{print $4}')
local splitColumn=$(echo "$wtf" | awk -F"|" '{print $5}')
local sqoopParallels=$(echo "$wtf" | awk -F"|" '{print $6}')
local query=$(echo "$wtf" | awk -F"|" '{print $7}')
local query+=' WHERE $CONDITIONS'
local types=   --> HERE I NEED TO PARSE THE LAST COLUMN ADDED <--

谢谢你的建议。

编辑

正如EdMorton所问的,这就是我在脚本中调用sqoop命令的方式。

sqoop import \
  -Dmapred.child.java.opts="-Djava.security.egd="file:/dev/../dev/urandom" " \
  -Dmapred.job.queuename="$yarnQueue" \
  -Dmapreduce.job.name=$quote"$jobName"$quote \
  --connect "$origServer" \
  --username "$username" \
  --password-file file://"$passwordFile" \
  --delete-target-dir \
  --target-dir "$targetTmpHdfsDir"/"$hiveTable" \
  --outdir "$dirJavaCode" \
  --hive-database "$hiveSchema" \
  --hive-table "$hiveTable" \
  --hive-partition-key "$hivePartitionName" \
  --hive-partition-value "$hivePartitionValue" \
  --query "$query" \
  --hive-import \
  --null-string "''" \
  --null-non-string "''" \
  --num-mappers 1 \
  --map-column-hive --> Here I need to add the new field <--
  --fetch-size 1000000 &>> "$logFileRaw"

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题