一、sqoop 将数据从mysql 导入 hive
导入步骤为:
a.先将mysql数据用sqoop导入到hdfs中
sqoop import
--connect jdbc:mysql://xxx:3306/xxx \
--username xxx \
--password xxx \
--query 'select columns from table_name where $CONDITIONS' \
--target-dir /user/hdfs/imp \
--delete-target-dir \
--num-mappers 1 \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
--fields-terminated-by '\t'
如果导出的数据库是mysql 则可以添加一个 属性 --direct ,数据导出速度会快一点,我在uat环境中测试了此参数,似乎在数据不大的导出时,对速度的影响不太明显。
–direct 使用直接导出模式(优化速度)
若执行成功后,可在hive验证是否导入成功,命令为
dfs -ls /user/hdfs/imp
b.在hive中创建一张表
drop table if exists default.testDemo;
create table default.testDemo(
id string,
name string,
branch_name string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
c.将hdfs中的数据导入到hive中
load data inpath '/user/hdfs/imp' into table default.testDemo;
验证是否导入hive成功 :
select * from default.testDemo;
二、sqoop 将数据从hive导出到 mysql
使用 staging-table(临时表)参数,保证数据完全成功导出到临时表(testDemo_tmp)表中,再把testDemo_tmp 中的数据move到目标表(testDemo)。这种方式的前提是:临时表和目标表表结构必须完全一致。
sqoop export \
--connect jdbc:mysql://xxxx:3306/db_base \
--username xxx \
--password xxx \
--input-fields-terminated-by "\001" \
--input-lines-terminated-by "\n" \
--input-null-string "\\n" \
--input-null-non-string "\\n" \
--staging-table testDemo_tmp \
--clean-staging-table \
--table testDemo \
--export-dir hdfs_url_xxx/hive_table_xxx \
--columns "column,...,columns"
此种方法导出有个弊端,若mysql表有主键约束,就不能反复执行sqoop导出(会因为主键冲突导出失败)。当时我们的优化方案时,在执行sqoop export之前,调一段shell脚本根据导入条件delete一遍。
#!/bin/bash
function clearData(){
dateStr=`date -d 'yesterday' +%Y%m%d`
result=`mysql -h$1 -u$2 -p$3 <<EOF
use $4;
delete from testDemo where data_date='${dateStr}';
exit
EOF`
}