前言:本文由实现此博客过程中遇到的问题及解决办法整理而成。博客:淘宝双11数据分析与预测课程案例-步骤三:将数据从Hive导入到MySQL_厦大数据库实验室
操作前准备
数据
数据放在
/usr/local/data/comment.csv
数据来源于:Amazon Reviews: Unlocked Mobile Phones | Kaggle
大数据开发环境
软件版本hadoop2.7mysql5.7hive2.1.0sqoop1.4.6
未知hive2.1.0和sqoop1.4.7是否有兼容性问题,推荐使用sqoop1.4.6
数据预处理
删除第一行表头
# 1d表示删除第1行,同理,3d表示删除第3行,nd表示删除第n行cd /usr/local/data
sed -i '1d' comment.csv
head -n 5 comment.csv
查看是否存在多余字符或空行
使用
vim
查看文件内容以及是否有多余的无关符号。虽然编辑器
gedit
也可查看文件内容,但是不能显示所有字符,故推荐使用
vim
- 若每行行尾存在字符
^M
,可能出现的原因是:该文件在导入Linux系统前在Windows系统下编辑过解决办法:通过字符替换,将^M
换掉具体操作:利用vim
打开文件,然后输入vim
命令%s/^M$//g
,进行全文件查找替换。注意:^M
不是键盘中的符号直接输入,而是使用快捷键,^
使用ctrl+v
来输入,M
使用ctrl+m
来输入
导入过程
启动hadoop
cd /usr/local/java/hadoop/hadoop-2.7.1
./sbin/start-dfs.sh
在HDFS中创建目录
hadoop fs -ls /
hadoop fs -mkdir -p /data/amazon
将文件上传至HDFS中
hadoop fs -put /usr/local/data/comment.csv /data/amazon
查看文件内容
hadoop fs -cat /data/amazon/comment.csv |head -5
启动mysql
service mysql start
启动hive
cd /usr/local/java/hive-2.1.0
./bin/hive
选择
amazon
数据库
hive> use amazon;
创建hive外部表
# 用 /data/amazon 创建 amazon数据库中 goods 表
hive> CREATE EXTERNAL TABLE amazon.goods(product_name STRING,brand_name STRING,price INT,rating INT,reviews STRING,votes INT) COMMENT 'Welcome to shandong. Now create amazon!' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/data/amazon';
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
:以
,
结尾的行格式分隔字段
分隔符号的选择:在HDFS(localhost:hdfs:50070)中下载文件,使用
vim
查看文件分隔符以及是否有多余无关符号
查询hive表中的数据
hive>select * from goods limit 10;
hive>exit;
hive数据库中表行尾$
查看文件分隔符
hive -e "select * from amazon.goods limit 10">> res
head -n 2 res |cat -A
以下为输出结果,分隔符号为
^I
"""CLEAR CLEAN ESN"" Sprint EPIC 4G Galaxy SPH-D700*FRONT CAMERA*ANDROID*SLIDER*QWERTY KEYBOARD*TOUCH SCREEN"^ISamsung^I199^I4^I"nice phone^INULL$
"""CLEAR CLEAN ESN"" Sprint EPIC 4G Galaxy SPH-D700*FRONT CAMERA*ANDROID*SLIDER*QWERTY KEYBOARD*TOUCH SCREEN"^ISamsung^I199^I5^IVery pleased^I0$
创建临时表 inner_goods
Hive会自动在HDFS文件系统(
/hive/warehouse/amazon.db/inner_goods
)中创建对应的数据文件
hive> create table amazon.inner_goods(product_name STRING,brand_name STRING,price INT,rating INT,reviews STRING,votes INT) COMMENT 'Welcome to shandong. Now create inner table inner_goods ' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
将amazon外部表中的数据插入到 inner_goods
hive> INSERT OVERWRITE TABLE amazon.inner_goods select * from amazon.goods;
查看插入命令是否成功执行
hive>select * from inner_goods limit 10;
登录mysql
mysql -u root -p
mysql> show databases;#显示所有数据库
mysql> create database amazon;#创建dbtaobao数据库
mysql> use amazon;#使用数据库
查看数据库的编码
mysql> show variables like "char%";
设置| character_set_server | utf8
sudovi /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]下添加一行character_set_server=utf8
重启MySQL服务。service mysql restart
登陆MySQL,并查看MySQL目前设置的编码。show variables like "char%";
在amazon数据库中创建表amazon
mysql> CREATE TABLE `amazon`.`amazon`(`product_name` varchar (1500), `brand_name` varchar(300), `price` float, `rating` int, `reviews` varchar(20000), `votes` int)ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql>exit;
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535.
实际操作中发现
VARCHAR
最大限制21845个字符
# 导入数据cd /usr/local/java/sqoop-1.4.6
bin/sqoop export --connect jdbc:mysql://localhost:3306/amazon --username your_username --password your_password --table amazon --export-dir '/hive/warehouse/amazon.db/inner_goods' --fields-terminated-by ',' --input-null-non-string '\\N';# jdbc:mysql://localhost:3306/amazon amazon为mysql的数据库名# --username your_username --password sdufewsp 登录mysql的用户名和密码# --table amazon 从amazon表中导出数据到sqoop# --export-dir '/hive/warehouse/amazon.db/inner_goods' HDFS中的导出目录# --fields-terminated-by ',' 分隔符# --input-null-non-string 忽略表数据中的空值
java.lang.RuntimeException: Can't parse input data: '\N',For input string: "\N"
主要是因为hive 中的表数据为空导致的,添加一个参数忽略空:
--input-null-non-string '\\N'
下载mysql-workbench
通过
Mysql Workbrench
可视化查看表内容
sudoapt-getinstall mysql-workbench
报错反思
- 在遇到报错时,没能保留过程,导致报错解决后,无法对比反思报错原因
- 解决报错时,需要找到报错的核心部分,如:
caused by……
、error
参考文章:
【SQOOP】 sqoop java.lang.RuntimeException: Can‘t parse input data: ‘\N‘,For input string: “\N“_Zsigner的博客-CSDN博客
Sqoop工具从hive导出数据到MySQL踩坑记 - 简书 (jianshu.com)
Linux系统中文件行末尾出现^M的原因及解决办法 - WayneLiu123 - 博客园 (cnblogs.com)
版权归原作者 思想在拧紧 所有, 如有侵权,请联系我们删除。