sqoop将Mysql数据导入Hive中

  • 注:笔者用的是sqoop1.4.6版本

一、将Mysql数据导入Hive中

命令:

sqoop import  
-Dorg.apache.sqoop.splitter.allow_text_splitter=true       
--connect jdbc:mysql://xxx:3306/db 
--username user 
--password pwd 
--table  tablename 
--hive-import 
--hive-table tablename 

如果该表没有主键:可将其运行在一个map中,如下

sqoop import 
--connect jdbc:mysql://xxx:3306/db 
--username user 
--password pwd 
--table tablename 
--hive-import 
--hive-table tablename -m 1

操作实例:
创建mysql表testSqoop

DROP TABLE IF EXISTS `testsqoop`;
CREATE TABLE `testsqoop` (
  `XH` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '序号',
  `SSQ` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '所属区'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入测试数据:

INSERT INTO `testsqoop` VALUES ('1', '海珠区');
INSERT INTO `testsqoop` VALUES ('10', '白云区');
INSERT INTO `testsqoop` VALUES ('11', '黄埔区');
INSERT INTO `testsqoop` VALUES ('12', '荔湾区');
INSERT INTO `testsqoop` VALUES ('13', '天河区');
INSERT INTO `testsqoop` VALUES ('14', '海珠区');
INSERT INTO `testsqoop` VALUES ('15', '海珠区');
INSERT INTO `testsqoop` VALUES ('16', '海珠区');
INSERT INTO `testsqoop` VALUES ('17', '荔湾区');
INSERT INTO `testsqoop` VALUES ('18', '海珠区');
INSERT INTO `testsqoop` VALUES ('19', '黄埔区');
INSERT INTO `testsqoop` VALUES ('2', '黄埔区');
INSERT INTO `testsqoop` VALUES ('20', '黄埔区');
INSERT INTO `testsqoop` VALUES ('21', '番禺区');
INSERT INTO `testsqoop` VALUES ('22', '花都区');
INSERT INTO `testsqoop` VALUES ('23', '海珠区');
INSERT INTO `testsqoop` VALUES ('24', '白云区');
INSERT INTO `testsqoop` VALUES ('25', '花都区');
INSERT INTO `testsqoop` VALUES ('26', '海珠区');
INSERT INTO `testsqoop` VALUES ('27', '番禺区');
INSERT INTO `testsqoop` VALUES ('28', '天河区');
  • 执行导入Hive的命令(如果Hive中没有存在对应的hive表,则会依据mysql 的表来创建对应的表,字段属性也跟mysql的一致)

  • 1、这张表不存在的情况下(默认会自动创建对应的Hive表并全量将数据加载进去)

sqoop import 
--connect jdbc:mysql://xxx:3306/db 
--username xxx --password xxx 
--table  testSqoop 
--hive-import 
--hive-table testSqoop -m 1

hive中数据如下所示:

hive> select * from testSqoop;
OK
1       海珠区
10      白云区
11      黄埔区
12      荔湾区
13      天河区
14      海珠区
15      海珠区
16      海珠区
17      荔湾区
18      海珠区
19      黄埔区
2       黄埔区
20      黄埔区
  • 2、这张表存在的情况下(默认往表中追加数据)
sqoop import 
--connect jdbc:mysql://xxx:3306/db 
--username xxx 
--password xxx 
--table  testSqoop 
--hive-import 
--hive-table testSqoop -m 1
  • 3、复杂查询条件导入

    where 参数的使用

sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true 
--connect jdbc:mysql://192.168.1.2:3306/test 
--username root 
--password 123456 
--table  test1 
--where 
   " SXQMC='广东省广州市萝岗区' and XZJDMC='九龙镇' and BMC='女' and S_LAST_UPDATED > '2018-01-04 03:10:13'  and  S_LAST_UPDATED < '2018-01-04 03:21:00' "  
--hive-import 
--hive-table test1  
--hive-drop-import-delims

query 参数的使用

sqoop import 
-Dorg.apache.sqoop.splitter.allow_text_splitter=true 
--connect jdbc:mysql://192.168.1.2:3306/test 
--username root 
--password 123456  
--query  
   " select * from test1  where SXQMC='广东省广州市番禺区' and BMC='女' and S_LAST_UPDATED > '2018-01-04 03:10:13'  and  S_LAST_UPDATED < '2018-01-04 03:21:00'  AND \$CONDITIONS"  
--hive-import 
--hive-table test1  
--hive-drop-import-delims 
--target-dir  /apps/hive/warehouse/test1   
--split-by s_duid 

二、 sqoop 中导入常用参数简要说明

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

三、遇到的问题:

问题一:
出现如下错误提示:No primary key could be found for table t_gz_cyyqmcb

 17/12/13 10:35:58 ERROR tool.ImportTool: Error during import: No primary key could be found for table t_gz_cyyqmcb.

这里写图片描述

解决方法一:给该表添加主键便可;

解决方法二:加到sqoop 对应的参数 -m 1 ,也就是该命令只在一个mapreduce进程中进行,所以该方法会使得数据抽取的效率变低。

 sqoop import 
 --connect jdbc:mysql://xxx:3306/db 
 --username xxx  
 --password xxx 
 --table t_gz_cyyqmcb  
 --hive-import  
 --hive-table t_gz_cyyqmcb -m 1 

问题二:有关sqoop 分割符的问题

  • 在将mysql 中的数据导入到hive中,mysql 中的数据如下;
  • 如XH=1在mysql中这是一条数据,但是数据对应的某一列数据有换行符。

这里写图片描述

  • 在进行sqoop import 数据时,如果不加其他参数,导入的数据默认的列分隔符是’\001’,默认的行分隔符是’\n’。也就像下面的数据那样,在导入时出现换行符时hive以为这条数据已经结束,并将其后面输入的数据当做另一条数据。
    因而hive 默认会解析成两条数据,这样就造成导入数据时出现了数据跟原表不一致的问题。如下图所示:
sqoop import  
--connect jdbc:mysql://xxx:3306/db  
--username xxx  
--password xxx  
--table  testSqoop  
--hive-import  
--hive-table testSqoop -m 1

这里写图片描述

解决方法:
加上参数–hive-drop-import-delims来把导入数据中包含的hive默认的分隔符去掉
命令如下所示:

sqoop import  
--connect jdbc:mysql://xxx:3306/db  
--username xxx  
--password xxx  
--table  testSqoop  
--hive-import  
--hive-table testSqoop -m 1  
--hive-drop-import-delims

这里写图片描述

问题三: No columns to generate for ClassWriter

ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: No columns to generate for ClassWriter 

这个是由于mysql-connector-java的bug造成的,出错时我用的是mysql-connector-java-5.1.17,更新成mysql-connector-java-5.1.36.jar就可以了。
上面替换的jar包是sqool lib下对应的包。
如:笔者该jar包对应的目录为:/usr/hdp/2.5.3.0-37/sqoop/lib

  • 注:笔者的环境是开启了kerberos认证安全机制,因此在进行sqoop导数据前得先进行kerberos认证。

参考文档:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_purpose

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值