在工作中,我们经常遇到的业务就是要将MySQL每天差生的生产数据定时导入到Hive的分区表中,然后根据分区表中的数据进行“数仓建设”,各种数据处理。
那么怎么运用sqoop将MySQL的数据导入到hive的分区表中呐?
首先,不能再用--hive-table, --hive-partition-key, --hive-partition-value这三个参数。因为这样只能向单个分区导入数据,无法指定多个分区。
其实我采用的方法是 分两步进行的:
1、用sqoop将MySQL的数据导入HDFS上,注意HDFS存储的路径文件夹以分区的字段数据命名。
比如:
sqoop import --connect jdbc:mysql://localhost:3306/track_log \
--username root --password 123456 --table track_log18 \
-m 1 \
--target-dir /user/hive/warehouse/track_log/ds=20190622
--fields-terminated-by '\t' //这个也很重要,否则查询一列时会返回多列
这样的话,数据导入到了HDFS中,
2、建立分区并且将数据加载进去:
alter table track_log add partition(ds='20190622')
location '/user/hive/warehouse/track_log/ds=20190622';
这样分区的数据就加载进去了。
注意点:这两步之间最好插入一些检验的步骤。
比如说:
在1之前,检验分区是否已经存在,存在的话,直接删掉(注意会删除数据,但是在第二步会将数据再次加载,这样根据业务来说,是没有问题的)
在2之前,检验一下HDFS的目录是否存在,存在再执行第2步。