Linux下Shell编程实现基于Hadoop的ETL(Sqoop封装篇)

conf/sqoop.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<sqoop-shell type="import">
		<param key="connect">jdbc:mysql://master:3306/db_cda</param><!-- 数据库连接 必填-->
		<param key="username">root</param><!-- 数据库用户名 必填-->
		<param key="password">123</param><!-- 数据库密码 必填-->
		<param key="table"></param><!--导入的表 必填-->
		<!--<param key="columns"></param>--><!--导入的表的列-->
		<param key="query"></param><!--数据库查询语句,过滤出要导入的数据 -->
		<param key="where"></param><!--过滤数据-->
		<param key="target-dir"></param><!-- HDFS数据仓库存放位置 -->
		<param key="warehouse-dir"></param><!--导入数据到数据仓库的目录-->
		<param key="hive-table"></param>
		<param key="hive-partition-key"></param>
		<param key="hive-partition-value"></param>
		<param key="m">1</param><!--mapper的数量-->
		<param key="hive-overwrite"></param>
		<param key="hive-delims-replacement"></param>
		<param key="compress"></param><!--true or false 是否启用压缩输出-->
		<param key="compression-codec"></param><!--指定压缩算法-->
		<param key="null-string">'\\\\N'</param>
		<param key="null-non-string">'\\\\N'</param>
		<param key="split-by"></param>
		<param key="map-column-hive"></param>
		<param key="append"></param>
		<param key="delete-target-dir">true</param>
		<param key="as-avrodatafile"></param><!--true or false-->
		<param key="as-sequencefile"></param><!--true or false-->
		<param key="as-textfile">true</param><!--true or false-->
		<param key="hive-import">true</param><!--必须为true-->
	</sqoop-shell>
	
	<sqoop-shell type="export">
		<param key="connect">jdbc:mysql://master:3306/db_cda</param><!-- 数据库连接 -->
		<param key="username">root</param><!-- 数据库用户名 -->
		<param key="password">123</param><!-- 数据库密码 -->
		<param key="table"></param>
		<param key="export-dir"></param><!-- HDFS数据仓库存放位置 -->
		<param key="num-mappers">1</param>
		<!--<param key="input-null-string"></param>-->
		<!--<param key="input-null-non-string"></param>-->
		<!--<param key="input-enclosed-by"></param>-->
		<!--<param key="input-escaped-by"></param>-->
		<param key="input-fields-terminated-by">'\\t'</param>
		<!--<param key="input-lines-terminated-by"></param>-->
		<!--<param key="input-optionally-enclosed-by"></param>-->
		<!--<param key="enclosed-by"></param>-->
		<!--<param key="escaped-by"></param>-->
		<!--<param key="fields-terminated-by"></param>-->
		<param key="lines-terminated-by">'\\n'</param>
		<param key="mysql-delimiters"></param>
		<!--<param key="optionally-enclosed-by"></param>-->
	</sqoop-shell>
</root>
bin/sqoop.sh

#!/bin/bash
#get the environment
if [ -f ~/.bashrc ];#进入Bash Shell环境,用于下面命令执行
then
 . ~/.bashrc

#获取当前命令的路径
bin=`dirname $0`
bin=`cd "$bin";pwd`
filename="$bin"/../conf/sqoop.xml
#if file not exsist,will exit;
fi
if [ -z $filename ];then
	echo 'USAGE:COMMAND FILENAME'
	exit 0
fi

#各种预定义变量及数组
declare -i i=0
declare -i j=0
declare -a importKeys
declare -a importValues
declare -a exportKeys
declare -a exportValues

flag=0
#处理掉配置文件中的空格、空行、以及注释等
content=`sed -e 's/\s*\(.*\)\s*$/\1/g' -e 's/\s*\(=\)\s*/\1/g' -e '/^\(\s\)*$/d' -e '/^$/d' -e 's/<!--.*-->//' $filename`
#然后循环遍历XML文件中的每一行
while read line
do \
	if echo ${line}|grep -qE "^<sqoop-shell type=\"import\">" ; then
		flag=1
		continue
	fi

	if echo ${line}|grep -qE "^<sqoop-shell type=\"export\">" ; then
		flag=2
		continue
	fi

	if echo ${line}|grep -qE "<\/sqoop-shell>" ; then
		flag=0
		continue
	fi

	if [ ${flag} -ne 0 ] ; then
		#处理获得到key值
		key=`echo ${line}|sed -n -e 's/<param key=\"//' -e 's/\">.*<\/param>//p'|tr -d '\r'`
		#处理获得到Value值
		value=`echo ${line}|sed -n -e 's/<param key=\".*\">//' -e 's/<\/param>//p'|tr -d '\r'`
		#如果key值为空,则跳过
		if [ ${#key} -eq 0 ] ; then
			continue
		fi
		#否则根据标记,把key和value加入到导入或者导出数组中
		if [ ${flag} -eq 1 ] ; then
			importKeys[$i]=$key
			importValues[$i]=$value
			let i++
		elif [ ${flag} -eq 2 ] ; then
			exportKeys[$j]=$key
			exportValues[$j]=$value
			let j++
		fi
	fi
done \
<<EOF
$content
EOF

#获取第一个命令
command=$1
shift

#循环处理命令中的值,覆盖掉默认值
while [ $# -ne 0 ]
do
	if [ "$command" = "import" ] ; then
		for((k=0;k<${#importKeys[*]};k++))
		do
			#如果存在默认值,则覆盖掉默认值
			if [ "${1:2}" = "${importKeys[$k]}" ] ; then
				importValues[$k]=${2}
				shift
				shift
			fi				
		done
	elif [ "$command" = "export" ] ; then
		for((k=0;k<${#exportKeys[*]};k++))
		do
			if [ "${1:2}" = "${exportKeys[$k]}" ] ; then
				exportValues[$k]=${2}
				shift
				shift
			fi
		done
	fi
done
#循环拼接命令字符串
sqoop="sqoop"
if [ "$command" = "import" ] ; then
	sqoop="${sqoop} import"
	for((k=0;k<${#importKeys[*]};k++))
	do
		if [ ${#importValues[$k]} -eq 0 ] ; then
			continue
		fi
		#如果命令的值为true,则只进行命令的拼接
		if [ "${importValues[$k]}" = "true" ] ; then
			sqoop="${sqoop} --${importKeys[$k]}"
			continue
		fi
		sqoop="${sqoop} --${importKeys[$k]} ${importValues[$k]}"
	done
elif [ "$command" = "export" ] ;then
	sqoop="${sqoop} export"
	for((k=0;k<${#exportKeys[*]};k++))
	do
		if [ ${#exportValues[$k]} -eq 0 ] ; then
			sqoop="${sqoop} --${exportKeys[$k]}"
			continue
		fi
		sqoop="${sqoop} --${exportKeys[$k]} ${exportValues[$k]}"
	done
fi
#执行拼接后的字符串
eval $sqoop

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

加群:397706991,共同学习

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值