Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf 使用query导入hdfs

案例1:将test下的userinfo表导入到hdfs

表没有主键 需要指定map task的个数为1个才能执行

将test下的userinfo表导入到hdfs 指定m即MapReduce的个数1 目录

sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--username root --password root \
--table userinfo \
-m 1 \
--target-dir hdfs://qf:8020/out/userinfo

Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs

没有指定驱动 出现 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:930)
No columns to generate for ClassWriter 写上就好了 


将test下的userinfo表导入到hdfs 
--m 1 指定m即MapReduce的个数1 默认是4个tasks 不管文件大小
目录
sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table userinfo \
-m 1 \
--target-dir hdfs://qf:8020/out1//00

Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs
Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs

压缩

1.默认压缩格式.gz

–compress \

sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table userinfo \
--m 1 \
--fields-terminated-by '\t' \
--compress \
--columns 'id,name' \
--target-dir hdfs://qf:8020/out1/01



--compress默认是.gz格式

Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs

2.指定压缩格式lzo

–compress
–compression-codec com.hadoop.compression.lzo.LzoCodec \

sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table userinfo \
--m 1 \
--fields-terminated-by '\t' \
--compress \
--compression-codec com.hadoop.compression.lzo.LzoCodec \
--columns 'id,name' \
--target-dir hdfs://qf:8020/out1/02


create external table lzo_test1(
id bigint,
firstname string
)
row format delimited fields terminated by '\t'
stored as inputformat "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
outputformat "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat" 
location '/out1/02'
;

感觉因为后缀不是lzo的原因 
所以读不出来
https://blog.csdn.net/weixin_33857679/article/details/94559894
参考博客 
感觉需要本地库编译 所以 emmm 就这样吧

Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs

使用query导入:
--query 和 --table 不能同时存在
sql写成1行
query后使用'' 和 "" 的区别  

注意where最后一定跟:and $CONDITIONS \

--delete-target-dir \如果目录存在则删除

使用query导入 ,sql查询语句

sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--m 1 \
--fields-terminated-by '\t' \
--query 'select s1.id, s1.name from userinfo s1 left join userinfo s2 on s1.id = s2.id where s2.name is not null and s1.id >= 3 and $CONDITIONS' \
--as-parquetfile \
--target-dir hdfs://qf:8020/out1/04


19/09/18 11:35:08 INFO manager.SqlManager: Using default fetchSize of 1000
19/09/18 11:35:08 INFO tool.CodeGenTool: Beginning code generation
19/09/18 11:35:08 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
	at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:97)
	at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:478)
	at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
	at org.apache.sqoop.Sqoop.run(Sqoop.java:143)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
	at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
	at org.apache.sqoop.Sqoop.main(Sqoop.java:236)
	
	去掉--as-parquetfile \ 这句话就行  
	查出来的表结果集好像不能直接使用列式存储
sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--m 1 \
--fields-terminated-by '\t' \
--query 'select s1.id, s1.name from userinfo s1 left join userinfo s2 on s1.id = s2.id where s2.name is not null and s1.id >= 3 and $CONDITIONS' \
--delete-target-dir \
--target-dir hdfs://qf:8020/out1/04

Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs

导入到hive表:

1.先建表
create table sq1(
id bigint,
firstname string
)
row format delimited fields terminated by '\t';

2.导入
sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table stu1 \
--columns 'id, name' \
--null-non-string 0 \
--delete-target-dir \
--fields-terminated-by '\t' \
--hive-import \
--hive-overwrite \
--hive-table sql

19/09/18 21:27:05 ERROR tool.ImportTool: Error during import: No primary key could be found for table stu1. Please specify one with --split-by or perform a sequential import with '-m 1'.

告诉我们 需要指定主键  使用 --split-by
不指定的话 就用 -m 1指定1个maptask

sqoop import --connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--split-by id \
--table stu1 \
--columns 'id, name' \
--null-non-string 0 \
--delete-target-dir \
--fields-terminated-by '\t' \
--hive-import \
--hive-overwrite \
--hive-table qf24.sq1

注意别忘了指定库名 不然就导入到 /user/hive/warehouse 这个目录下面了 一个单独的文件

看执行过程的输出可知:

是实际上mysql到hive的过程sqoop分为了两个过程,先从mysql导入到hdfs的临时目录

然后再从hdfs导入到hive
Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs
上图 一个结束了 第二个过程又开始了
Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs
可以看到成功标志,并且移除了那个临时目录

查看一下表

Sqoop-import案例:mysql导入hdfs 指定压缩格式导入hdsf  使用query导入hdfs

注意

如下两个使用于有主键的表的数据更新:
–update-key
–update-mode allowinsert

mysql表的编码格式做为utf8,hdfs文件中的列数和mysql表中的字段数一样

导出暂不能由hive表导出mysql关系型数据库中

从hdfs到mysql时注意数据类型

–export-dir是一个hdfs中的目录,它不识别_SUCCESS文件

上一篇:关系型数据的收集


下一篇:使用Sqoop在HDFS和RDBMS之间导数据