sqoop可用于将关系型数据库与分布式存储系统进行数据的转换存储,例如可以将mysql中的数据与hive下的存储数据进行互转,但实质上仍然是读取hdfs下的存储文件。
有关sqoop的基本应用语法可以参考以下两篇sqoop中文手册:
http://blog.csdn.net/myrainblues/article/details/43673129
http://www.zihou.me/html/2014/01/28/9114.html
下面主要讲几点实际应用中注意的要点:
export命令中的分隔符作用
–input-fields-terminated-by ‘\001’ 从hive(即HDFS)中导出至mysql中时,默认的存储文件类型是testfile,域分隔符采用hive默认的分隔符 ‘\001’export命令中的null字段作用
从hive中导入分区表进入拥有自增长主键的mysql表时,由于mysql表中主键id是自动编号增长,而hive表缺乏该字段,故在hive表中对应的表需要将id字段置为null值,然后在导入mysql中时设置参数 –input-null-string ‘\N’ –input-null-non-string ‘\N’export中针对timestamp类型数据导出
hive中支持时间戳类型,可以from_unixtime(unix_timestamp(concat_ws(” “,sale_dt,sale_tm),”yyyyMMdd HHmmss”),”yyyy-MM-dd HH:mm:ss”),转化成hive格式化字段,之后将该字段数值导入mysql可被识别import命令中的分区命令
从mysql导入数据进入hive中时,域分隔符会采用默认的分隔符 ‘\001’,若要实现分区列表形式,可采用参数–hive-partition-key statis_date –hive-partition-value 20151101形成分区export中的更新修改方式
从hive导出数据至mysql中时,一般不太容易考虑数据的修改更新问题,但是sqoop中提供了这样一种方式实现插入mysql数据库中的update参数命令,若是想实时插入修改,可以使用–update-key id参数指定查询列为id,其余未指定的列均被修改,若想在更新的同时执行插入(如果存在id则修改,否则插入id行),则可以再加入参数–update-mode allowinsert(注:这里需要制定id为主键才能其效果,否则仍然只是插入功能,并不能达到update的修改),其具体效果如下:
HDFS下的数据集格式如下:0,this is a test,42
1,some more data,100
…插入mysql中可变相等于该update语句:
UPDATE foo SET msg=’this is a test’, bar=42 WHERE id=0;
UPDATE foo SET msg=’some more data’, bar=100 WHERE id=1;
…