目录
- 数据传输流程
- 脚本
- 报错和异常说明
-
- [1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf](#1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf)
- [2. 数据导入hive后显示NULL](#2. 数据导入hive后显示NULL)
数据传输流程
mysql---->>hdfs---->>hive
数据从mysql表中取出,放到hdfs上(由target-dir指定目录),所有数据转移完成后,将hdfs上传数据到hive表的对于目录下,并将该目录删除
脚本
bash
import
--connect
jdbc:mysql://127.0.0.1:3306/sqoop
--username
root
--password
password
--as-textfile
--target-dir
/sqoop/student4
--delete-target-dir
--num-mappers
1
--bindir
/opt/module/sqoop/lib
--table
student
--columns
id,name
--fields-terminated-by
,
--hive-import
--hive-table
student
报错和异常说明
1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
原因 :缺少hive的配置文件
解决方案:将hive目录下的hive-common-3.1.2.jar移动到sqoop的lib目录下
2. 数据导入hive后显示NULL
原因 :建hive表是设定的分割符不恰当,跟从mysql导入过来的数据的分隔符不一样,所以导致hive切分不了数据,于是查询为空,但是这个过程,不属于导入失败,所以导入脚本正常运行。
导入流程:mysql---->>hdfs---->>hive
解决方案 :
首先检查mysql内部的数据是否正确导入到hdfs中
一般而言,mysql中的数据切分是','
检查hdfs中的数据情况(执行以下代码)
sqoop脚本student
bash
import
--connect
jdbc:mysql://127.0.0.1:3306/sqoop
--username
root
--password
password
--as-textfile
--target-dir
/sqoop/student3
--delete-target-dir
--num-mappers
1
--bindir
/opt/module/sqoop/lib
--table
student
--columns
id,name
--fields-terminated-by
,
脚本执行代码
bash
sqoop --options-file sqoop_student.txt
检查生成的hdfs文件
bash
hdfs dfs -cat /sqoop/student3/part-m-00000
分析
hdfs中,数据以','进行分割,因此hdfs---->>hive中也需要设定','作为分隔符
hive数据库创建
数据库创建脚本
设定','作为分割符
bash
create table student
(
id string,
name string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
检查数据库情况
bash
show create table student;
完整的导入脚本mysql---->>hdfs---->>hive
bash
import
--connect
jdbc:mysql://127.0.0.1:3306/sqoop
--username
root
--password
password
--as-textfile
--target-dir
/sqoop/student4
--delete-target-dir
--num-mappers
1
--bindir
/opt/module/sqoop/lib
--table
student
--columns
id,name
--fields-terminated-by
,
--hive-import
--hive-table
student
总结
可以修改分隔符为其他的形式'\t' '\001'都可以,但是需要保证hdfs和hive中的分隔符统一