Linux下Shell编程实现基于Hadoop的ETL(导入篇)

来源:互联网 发布:网络营销人才需求数据 编辑:程序博客网 时间:2024/06/05 14:41

在这里我们直接给出代码,然后对代码解析分析来学习:

conf/import.xml

<?xml version="1.0" encoding="UTF-8"?><root><task type="add"><!--增量导入的表--><table>think_task</table><table>think_task_child</table><table>think_user_task</table></task><task type="all"><!--全量导入的表--><table>think_user_task</table><table>think_task</table></task></root>

在这里主要配置一些需要增量导入的表和一些全量导入用于初始化的表

bin/import.sh

#!/bin/bash#########################以下主要使用sed命令对XML进行解析,sed命令的作用是去除符合规则的字符串#tr -d '\r' 用于删除每行末尾的换行符#注:以下的操作都是基于bash Shell环境的以及Hadoop已经安装的基础上#########################get the environmentif [ -f ~/.bashrc ];#进入shell环境,用于执行下面的命令then . ~/.bashrcfi#file exitif [ -z $1 ];then #判断conf/import.xml的配置文件是否存在echo 'USAGE:COMMAND FILENAME'exit 0fi#timeyesterdaystr=$(date -d "yesterday" +%Y-%m-%d) #获取昨天的日期yesterdaytimestamp=$(date -d "$yesterdaystr" +%s) #截止到昨天的时间戳declare -a tables_add #预定义增量导入表数组declare -a tables_all #预定义全量导入表数组#预定义XML的处理标签XML_PNODE=taskXML_PNODE_TYPE1=addXML_PNODE_TYPE2=allXML_CNODE=table#全量增量导入标示符FLAG=0declare -i i=0declare -i j=0#获取命令的所在目录bin=`dirname "$0"`bin=`cd "$bin"; pwd`#去除配置文件中无用的空格、空行、注释以及等号两边的空格等OUTFILE=`sed -e 's/>/>\n/g' -e 's/\s*\(.*\)\s*$/\1/g' -e 's/\s*\(=\)\s*/\1/g' -e '/^\(\s\)*$/d' -e '/^$/d' -e 's/<!--.*-->//' -e 's/\r//' $1`#循环读取XMLwhile read linedo#如当前行符合增量开始标签时,FLAG置为1if echo ${line}|grep -qE "^<$XML_PNODE type=\"add\"" ; thenFLAG=1continuefi#如当前行符合结束标签时,FLAG置为0if echo ${line}|grep -qE "</$XML_PNODE>" ; thenFLAG=0continuefi#如当前行符合全量开始标签时,FLAG置为2if echo ${line}|grep -qE "^<$XML_PNODE type=\"all\"" ; thenFLAG=2continuefi#若FLAG为1时,代表接下来解析出增量表if [ ${FLAG} -eq 1 ] ; thenadd_tmp=`echo ${line}|sed -n -e 's/<table>//' -e 's/<\/table>//p'|tr -d '\r'`#如果解析后的表名为空,则跳过,否则添加到增量数组中if [ ${#add_tmp} -eq 0 ] ; then continuefitables_add[$i]=$add_tmplet i++continuefi#若FLAG为2时,代表接下来解析全量表if [ ${FLAG} -eq 2 ] ; thenall_tmp=`echo ${line}|sed -n -e 's/<table>//' -e 's/<\/table>//p'|tr -d '\r'`#如果解析后的表名为空,则跳过,否则添加到全量数组中if [ ${#all_tmp} -eq 0 ] ; then continuefitables_all[$j]=$all_tmplet j++continuefidone<<EOF$OUTFILEEOFhdfs dfsadmin -safemode leave#重置shellsql变量unset shellsql#根据判断.import_all是否存在来判断是进行增量还是全量导入,然后拼接命令字符串if [ -f ".import_all" ] ; thenshellsql="echo -e \"\033[41:33m excute import.sh start import add tables ${tables_add[*]} \033[0m\""for ((i=0;i<${#tables_add[*]};i++))doshellsql="${shellsql} && ${bin}/sqoop.sh import --table ${tables_add[$i]} --where 'create_time > $yesterdaytimestamp'"doneshellsql="${shellsql} && echo -e \"\033[41:33m excute import.sh finished import add tables ${tables_add[*]} \033[0m\""elseshellsql="echo -e \"\033[41:33m excute import.sh start import all tables ${tables_all[*]} \033[0m\""for ((i=0;i<${#tables_all[*]};i++))doshellsql="${shellsql} && ${bin}/sqoop.sh import --table ${tables_all[$i]}"doneshellsql="${shellsql} && echo -e \"\033[41:33m excute import.sh finished import all tables \033[0m\""touch .import_all #生成隐藏文件,在全量导入后成功fieval $shellsql

具体Shell代码下载:http://download.csdn.net/detail/luo849278597/9490920

加群:397706991,共同学习

0 0