| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> sqoop将Mysql数据导入Hive中 -> 正文阅读 |
|
[大数据]sqoop将Mysql数据导入Hive中 |
?本实验Sqoop版本:Sqoop 1.4.6.2.6.0.3-8 1 mysql创建表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; 2 插入数据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', '海珠区'); 3 执行导入Hive的命令3.1 简单导入(如果Hive中没有存在对应的hive表,则会依据mysql 的表来创建对应的表,字段属性也跟mysql的一致) 这张表存在的情况下(默认往表中追加数据) su - hdfs sqoop import --connect jdbc:mysql://172.16.2.136:3333/wxh --username root --password byxf54root --table ?testsqoop --hive-import --hive-table testsqoop -m 1 这张表不存在的情况下(默认会自动创建对应的Hive表并全量将数据加载进去) -bash-4.2$ hive log4j:WARN No such property [maxFileSize] in org.apache.log4j.DailyRollingFileAppender. Logging initialized using configuration in file:/etc/hive/2.6.0.3-8/0/hive-log4j.properties WARNING: Directory for Hive history file: /home/hive does not exist. ??History will not be available during this session. hive> show databases; OK default fdm hive> use default; hive> show tables; testsqoop hive> select * from testsqoop; 1 海珠区 10 白云区 11 黄埔区 12 荔湾区 13 天河区 14 海珠区 15 海珠区 16 海珠区 17 荔湾区 18 海珠区 19 黄埔区 2 黄埔区 hive> show create table testsqoop; CREATE TABLE `testsqoop`( ??`xh` string, ??`ssq` string) COMMENT 'Imported by sqoop on 2021/07/23 20:54:36' ROW FORMAT DELIMITED ??FIELDS TERMINATED BY '\u0001' ??LINES TERMINATED BY '\n' STORED AS INPUTFORMAT ??'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT ??'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION ??'hdfs://hadoop-test03/apps/hive/warehouse/testsqoop' TBLPROPERTIES ( ??'numFiles'='1', ??'numRows'='0', ??'rawDataSize'='0', ??'totalSize'='271', ??'transient_lastDdlTime'='1627044892') Time taken: 0.338 seconds, Fetched: 19 row(s) 3.2 复杂查询条件导入-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 3.3 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 4 相关参数5 问题问题一:出现如下错误提示: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 ClassWriterERROR 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认证。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/25 15:24:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |