我使用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"
暂无答案!
目前还没有任何答案,快来回答吧!