Sqoop导出实战
普通导出
在Sqoop中,使用export进行导出,指的是从HDFS中导出数据到MySql中:
- 构建MySql的表:
CREATE TABLE `u2` (
`id` int(11) DEFAULT NULL,
`age` int(11) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码
- HDFS导出到MySql
第一种:
上传数据到HDFS
[root@qianfeng01 ~]# vim u2.txt
1,18
2,20
3,30
[root@qianfeng01 ~]# hdfs dfs -put u2.txt /
导出语句:
[root@qianfeng01 sqoop-1.4.7]# sqoop export --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table u2 \
--export-dir '/u2.txt' \
--input-fields-terminated-by ',' \
-m 1
复制代码
要注意以下问题
- MySql表的编码格式做为utf8,HDFS文件中的列数类型和MySql表中的字段数一样,最好指定分隔符
- 导出暂不能由Hbase表导出MySql关系型数据库中
--export-dir
是一个hdfs中的目录,它不识别_SUCCESS文件- --query导入的时候注意设置问题。
- 导出数据中有些列值有"null",会报没法解析
- 导出数据的类型需要和MySql中的一致(能自动转没有问题)
更新并插入导出
场景:
多维结果数据导出;异常重跑数据
--update-mode :
updateonly,是默认,仅更新,不会新增数据;
allowinsert :更新并允许插入
--update-key : 指定更新字段
复制代码
CREATE TABLE `upv` (
`country_id` int(11) NOT NULL AUTO_INCREMENT,
`visits` int(11) DEFAULT NULL,
PRIMARY KEY (`country_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
导入数据:
[root@qianfeng01 sqoop-1.4.7]# sqoop import --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table upv \
--target-dir /sqoopdata/upv \
-m 1 \
--fields-terminated-by ',' \
--null-string '\\N' \
--null-non-string '0';
导出语句:
[root@qianfeng01 sqoop-1.4.7]# sqoop export --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table upv \
--export-dir /sqoopdata/upv/* \
--input-fields-terminated-by "," \
--update-mode allowinsert \
--update-key country_id
复制代码
Sqoop导出parquet格式的数据
导入数据到HDFS中为parquet格式:
[root@qianfeng01 sqoop-1.4.7]# sqoop import --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table u2 \
--delete-target-dir \
--target-dir '/sqoopdata/u2' \
-m 1 \
--fields-terminated-by '\t' \
--null-string '\\N' \
--null-non-string '0' \
--as-parquetfile
复制代码
Sqoop的Hcatalog方式
# 创建表:
CREATE TABLE `par` (
`id` int(11) NOT NULL DEFAULT '0',
`age` int(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# hive创建表:
hive> create table if not exists par(
`id` int,
`age` int
)
row format delimited fields terminated by '\t'
stored as parquet
location '/sqoopdata/u2/';
复制代码
将hive包中的lib目录下的hcatalog相关包拷贝到sqoop的lib目录中去:
考虑将hcatalog的包放到sqoop中或者做环境变量。
必须保证hive对mysql有执行权限
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
复制代码
导出parquet格式语句:
[root@qianfeng01 sqoop-1.4.7] sqoop export \
--connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table par \
--hcatalog-database default \
--hcatalog-table par \
-m 1
参数说明:
--table:MySQL库中的表名
--hcatalog-database:Hive中的库名
--hcatalog-table:Hive库中的表名,需要抽数的表