案例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
没有指定驱动 出现 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
压缩
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格式
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 就这样吧
使用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
导入到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
上图 一个结束了 第二个过程又开始了
可以看到成功标志,并且移除了那个临时目录
查看一下表
注意
如下两个使用于有主键的表的数据更新:
–update-key
–update-mode allowinsert
mysql表的编码格式做为utf8,hdfs文件中的列数和mysql表中的字段数一样
导出暂不能由hive表导出mysql关系型数据库中
从hdfs到mysql时注意数据类型
–export-dir是一个hdfs中的目录,它不识别_SUCCESS文件