概述
一、通过Sqoop将Hive表数据导入到Mysql
1、第一种是将hive上某张表的全部数据导入到mysql对应的表中。
2、第二种是将hive上某张表中的部分数据导入到mysql对应的表中。
两种方式的区别在于第二种情况需要指定要导入数据的列名称。两种情况的导入方式分别如下:
1.全部导入
Sqoop export --connect jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=utf-8 --username mysql(mysql用户名) --password 123456(密码) --table student(mysql上的表) --export-dir /user/hive/warehouse/tablename(hive上的表) --input-null-string "\N" --input-null-non-string "\N" --fields-terminated-by "," --lines-terminated-by 'n'
说明:
dbname?useUnicode=true&characterEncoding=utf-8:设置数据库的编码格式
--export-dir:指定hive表的存储路径,数据存储在HDFS中
--input-null-string "\N" --input-null-non-string "\N":为了避免空值时,没有数据,需要该命令
--fields-terminated-by "," :指定行内数据的分隔符
--lines-terminated-by 'n':指定行间数据的分隔符
2.部分导入
Sqoop export --connect jdbc:mysql://127.0.0.1:3306/dbname --username mysql(mysql用户名) --password 123456(密码) --table student(mysql上的表) --columns "id,name,age" --hcatalog-database sopdm(hive上的schema) --hcatalog-table student(hive上的表)
说明:
--columns :导入表中的部分字段,后面跟指定的列名;
--where :可以按条件导入数据;
sqoop import
--connect jdbc:mysql://localhost:3306/sqoop
--username root --password 123456
--table stu
--mapreduce-job-name FromMySQL2HDFS
--delete-target-dir
--fields-terminated-by 't'
-m 1
--null-string 0
--columns "name"
--target-dir STU_COLUMN_WHERE
--where 'id<3'
--query :按照查询条件导入数据,使用--query关键字,就不能使用--table和--columns
自定义sql语句的where条件中必须包含字符串 $CONDITIONS,$CONDITIONS是一个变量,用于给多个map任务划分任务范 围;
sqoop import
--connect jdbc:mysql://localhost:3306/sqoop
--username root --password 123456
--mapreduce-job-name FromMySQL2HDFS
--delete-target-dir
--fields-terminated-by 't'
-m 1
--null-string 0
--target-dir STU_COLUMN_QUERY
--query "select * from stu where id>1 and $CONDITIONS"
3.导入分区表到MySQL
从HIVE分区表导入到MySQL,需要依次导入每个分区的数据
sqoop export
--connect jdbc:mysql://server74:3306/Server74
--username root
--password 123456
--table dw_pvs_hour
--hive-partition-key datestr
--hive-partition-value ‘2017-11-05’
--export-dir /user/hive/warehouse/dw_pvs_hour/datestr=2017-11-15/
--input-fields-terminated-by '