6.Sqoop
Sqoop是一个用于hadoop数据和结构化数据之间转换的工具。全称SQL-TO-HADOOP.它可以把hadoop数据,包括hive和hbase存储的数据转化为结构化数据也就是数据库的数据,也可以把关系型数据库数据转化为hadoop数据
这些转换操作全是通过Hadoop的MapTask来完成的,并不会涉及到Reduce操作。这是因为我们只是进行数据的拷贝,并不会对数据进行处理或者计算,没有什么特殊的处理,所以在map阶段就可以输出数据。
Sqoop就是一个开源的工具,它允许用户将数据从关系型数据库抽取到hadoop中;也可以把MapReduce处理完的数据导回到数据库中。
6.1 sqoop命令详解
6.1.1 codegen 将关系型数据库表映射成java class以及javajar包
sqoopcodegen \
--connectjdbc:mysql://hadoop-all-01:3306/hadoop \
--usernamehive \
--passwordhive \
--tableemp \
--bindir/opt/code
6.1.2 create-hive-table创建hive表
sqoopcreate-hive-table \
--connect<jdbc_url> \
--username<username> \
--password<password> \
--table<table_name> \ #根据关系型数据库什么表导
--create-hive-table\ #如果表已经存在,则JOB失败
--hive-database<database_name> \ #指定hive表所属的database
--hive-overwrite\ #如果存在表数据,则覆盖
--hive-table<hive table_name> \ #需要导入hive表的名字
6.1.3 eval:执行一个sql语句,并在控制台打印出来
sqoopeval \
--connectjdbc:mysql://hadoop-all-01:3306/hadoop \
--usernamehive \
--passwordhive \
-e"SELECT * FROM emp"
6.2 export
语法:
sqoop export \
--columnscol1,col2,...... 导出到表哪几列
--direct:使用direct导出,速度更快
--export-dir<dir>: 从HDFS哪一个目录导出
-m<n>: 指定mapper个数
--table<table-name>:导出数据库哪一张表
解析输入参数:
--input-enclosed-by<char>: 设置输入字段的封闭字符
--input-escaped-by<char>:设置输入字段的转义字符
--input-fields-terminated-by<char>:HDFS文件字段分隔符
--input-lines-terminated-by<char>:HDFS文件换行符
输出格式化参数:
--enclosed-by<char>: 设置字段封闭符
--escaped-by<char>: 设置转义字符
--fields-terminated-by<char>: 设置每一字段分割符
--lines-terminated-by<char>: 设置每一行结束分割符
--mysql-delimiters:使用mysql默认的分隔符,fields:, lines: \n escaped-by: \
#如果在hive表中该字段是字符串且为NULL,然后理解成为NULL而不是\N
--input-null-string<null-string>
#如果在hive表中该字段是非字符串类型且为NULL,然后理解成为NULL而不是\N
--input-null-non-string<null-string>
sqoopexport \
--connectjdbc:mysql://hadoop-all-01:3306/hadoop \
--usernamehive \
--passwordhive \
--drivercom.mysql.jdbc.Driver \
--export-dir/user/hive/warehouse/hadoop.db/m_d \
--columns"id,country,city,phone" \
--tabledirector \
--num-mappers2 \
--direct\
--input-fields-terminated-by',' \
--input-null-string'\\N' \
--input-null-non-string'\\N'
这个其实跟HDFS数据导入到RMDBS表一样,因为数据就是存储在HDFS上的
6.3 import HDFS从RMDBS导入数据
import语法:
sqoop import \
--connect<jdbc-uri>
--username<username>
--password<password>
--target-dir<dir> #导入到哪一个HDFS目录
--table<table-name> #导入关系型数据库哪一张表的数据
--as-textfile# 导入为文本文件
--as-avrodatafile#导入为avro文件
--as-sequencefile#导入为序列化文件
--as-parquetfile#导入为parquet文件
--columns<col1,col2...>从