1.13-1.15 Sqoop导出数据Export使用

一、export

1、export概述

export工具将一组文件从HDFS导入到RDBMS。目标表必须已经存在于数据库中。根据用户指定的分隔符读取输入文件并将其解析为一组记录, 只有map;

[root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help export


sqoop-export有三种模式:

    默认模式:将它们转换为一组将INSERT语句注入数据库的语句。

    更新模式:Sqoop将生成UPDATE替换数据库中现有记录的语句。

    调用模式:Sqoop将为每条记录创建一个存储过程调用。


2、语法参数

sqoop-export有两种语法:
    sqoop export (generic-args) (export-args)
    sqoop-export (generic-args) (export-args)


##常用参数:
    --connect <jdbc-uri>:指定JDBC连接的数据库地址。
    --connection-manager <class-name>:指定要使用的连接管理器类。
    --driver <class-name>:手动指定要使用的JDBC驱动类。
    --hadoop-mapred-home <dir>:指定$ HADOOP_MAPRED_HOME路径
    --help:打印使用说明
    --password-file:为包含认证密码的文件设置路径。
    -P:从控制台读取密码。
    --password <password>:设置验证密码。
    --username <username>:设置验证用户名。
    --verbose:在工作时打印更多信息。
    --connection-param-file <filename>:提供连接参数的可选属性文件。
    --relaxed-isolation:将连接事务隔离设置为未提交给映射器的读取。



##验证参数
    --validate:启用对复制数据的验证,仅支持单个表复制。
    --validator <class-name>:指定要使用的验证程序类。
    --validation-threshold <class-name>:指定要使用的验证阈值类。
    --validation-failurehandler <class-name>:指定要使用的验证失败处理程序类。



##导出控制参数
    --columns <col,col,col…>:要导出到表格的列。
    --direct:使用直接导出快速路径。
    --export-dir <dir>:用于导出的HDFS源路径。
    -m,--num-mappers <n>:使用n个mapper任务并行导出。
    --table <table-name>:要填充的表。
    --call <stored-proc-name>:存储过程调用。
    --update-key <col-name>:锚点列用于更新。如果有多个列,请使用以逗号分隔的列列表。
    --update-mode <mode>:指定在数据库中使用不匹配的键找到新行时如何执行更新。mode包含的updateonly默认值(默认)和allowinsert。
    --input-null-string <null-string>:字符串列被解释为空的字符串。
    --input-null-non-string <null-string>:要对非字符串列解释为空的字符串。
    --staging-table <staging-table-name>:数据在插入目标表之前将在其中展开的表格。
    --clear-staging-table:表示可以删除登台表中的任何数据。
    --batch:使用批处理模式执行基础语句。



#############详解#############
一条导出语句中,必须有--export-dir参数和一个--table或者--call参数。这些指定要填充到数据库(或要调用的存储过程)的表以及HDFS中包含源数据的目录。

1、
--columns参数选择列并控制它们的排序。
默认情况下,表格中的所有列都被选中用于导出。以逗号为间隔选择和排列各个列。
例如:--columns "col1,col2,col3"
注意:--columns参数中不包含的列需要定义默认值或允许NULL值。否则,数据库将拒绝导入数据,从而导致sqoop导入失败。

2、
--num-mappers或-m 参数控制mapper任务的数量。默认情况下,Sqoop将为导出过程提供4个并行任务。
也可以根据目录中存在的文件数来控制mapper的数量。导出性能取决于并行度。
如果数据库已经在更新索引,调用触发器等方面遇到瓶颈,则额外的负载可能会降低性能。

3、
dircet模式
--direct参数来指定direct模式的代码路径。此项可能比标准JDBC的性能更高。

4、
字符串转换

--input-null-string和--input-null-non-string参数都是可选的。如果--input-null-string未指定,那么对于字符串类型的列,字符串“null”将被解释为空。如果--input-null-non-string未指定,则字符串“null”和空字符串将被解释为非字符串列的空值。

注意,除了由--input-null-non-string参数指定外,空字符串将始终被解释为非字符串列的空值。

5、
指定分段表

--staging-table选项充当用于分阶段导出数据的辅助表。

由于Sqoop将导出过程分解为多个事务,导致失败的导出作业可能导致部分数据被提交给数据库。这可能进一步导致后续作业由于在某些情况下插入冲突而失败,或导致其他数据中的重复数据。那么这种情况下就可以通过指定临时表来解决此问题,该阶段性数据最终在单个事务中移动到目标表中。

为了使用分段工具,您必须在运行导出作业之前创建分段表。该表必须在结构上与目标表相同。此表应该在导出作业运行之前为空,或者--clear-staging-table必须指定该选项。如果临时表包含数据并且指定了--clear-staging-table选项,则Sqoop将在开始导出作业之前删除分段表中所有数据。

注意:在将数据导入目标表之前支持暂存数据,但是不可用于--direct导出。--update-key更新现有数据的选项以及存储过程用于插入数据时调用导出时也不可用。




##输入格式参数
    --input-enclosed-by <char>:设置必需的字段封闭器。
    --input-escaped-by <char>:设置输入转义字符。
    --input-fields-terminated-by <char>:设置输入字段分隔符。
    --input-lines-terminated-by <char>:设置输入的行尾字符。
    --input-optionally-enclosed-by <char>    设置字段包含字符。



##输出格式参数
    --enclosed-by <char>:设置必需的字段包围字符。
    --escaped-by <char>:设置转义字符。
    --fields-terminated-by <char>:设置字段分隔符。
    --lines-terminated-by <char>:设置行尾字符。
    --mysql-delimiters:使用MySQL的默认分隔符集:fields:, lines:
 escaped-by: optional-enclosed-by:'。
    --optionally-enclosed-by <char>:设置字段包含字符。

Sqoop会自动生成代码来解析和解释包含要导出到数据库的数据的文件记录。如果这些文件是使用非默认分隔符(以换行符分隔的记录的逗号分隔字段)创建的,则应该再次指定相同的分隔符,以便Sqoop可以解析您的文件。

如果指定了不正确的分隔符,则Sqoop将无法在每行中找到足够的列。这会导致导出mapper任务失败并抛出异常:ParseExceptions。



##代码生成参数
    --bindir <dir>:编译对象的输出目录。
    --class-name <name>:设置生成的类名称。这覆盖--package-name。与之结合使用时--jar-file,设置输入类。
    --jar-file <file>:禁用代码生成;使用指定的jar。
    --outdir <dir>:生成代码的输出目录。
    --package-name <name>:将自动生成的类放入此包中。
    --map-column-java <m>:覆盖已配置列的从SQL类型到Java类型的默认映射。

如果要导出的记录是作为先前导入的结果生成的,则可以使用原始生成的类读取数据。在这种情况下指定--jar-file和--class-name避免指定分隔符。

现有生成的代码的使用与--update-key是不兼容的;更新模式导出需要新的代码生成来执行更新。也不能使用--jar-file参数,并且必须完全指定任何非默认分隔符。


二、export使用

1、从HDFS导入到mysql

##准备数据
[root@hadoop-senior ~]# touch /opt/datas/user.txt

[root@hadoop-senior ~]# vim !$
12,beifeng,beifeng
13,xuanyun,xuanyu

##上传到hdfs
[root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -mkdir -p /user/root/sqoop/exp/user/

[root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -put /opt/datas/user.txt /user/root/sqoop/exp/user/


##导入到mysql
bin/sqoop export 
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
--username root 
--password 123456 
--table my_user 
--export-dir /user/root/sqoop/exp/user/ 
--num-mappers 1

##查询,已经导入了
mysql> select * from my_user;
+----+---------+---------+
| id | account | passwd  |
+----+---------+---------+
|  1 | admin   | admin   |
|  2 | pu      | 12345   |
|  3 | system  | system  |
|  4 | zxh     | zxh     |
|  5 | test    | test    |
|  6 | pudong  | pudong  |
|  7 | qiqi    | qiqi    |
| 12 | beifeng | beifeng |
| 13 | xuanyun | xuanyu  |
+----+---------+---------+
9 rows in set (0.00 sec)


三、将RDBMS表中的数据导入到Hive表中

因为Hive数据存储在hdfs上,底层原理类似于hdfs-->RDBMS;

RDBMS—>HDFS—>Hive

先将数据导入到hdfs,再load data到hive;

##创建hive表,这里用SQL文件的方式
[root@hadoop-senior ~]# touch /opt/datas/imp-hive-user.sql
[root@hadoop-senior ~]# vim /opt/datas/imp-hive-user.sql
use default ;
drop table if exists user_hive ;
create table user_hive(
id int,
account string,
password string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '	' ;


[root@hadoop-senior hive-0.13.1-cdh5.3.6]# bin/hive -f /opt/datas/imp-hive-user.sql

hive (default)> show tables;
user_hive


##将mysql数据导入到hive表中
bin/sqoop import 
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
--username root 
--password 123456 
--table my_user 
--fields-terminated-by '	' 
--delete-target-dir 
--num-mappers 1 
--hive-import 
--hive-database default 
--hive-table user_hive


#在hive中查询,有数据了
hive (default)> select * from user_hive;
OK
user_hive.id    user_hive.account    user_hive.password
1    admin    admin
2    pu    12345
3    system    system
4    zxh    zxh
5    test    test
6    pudong    pudong
7    qiqi    qiqi
12    beifeng    beifeng
13    xuanyun    xuanyu
Time taken: 0.045 seconds, Fetched: 9 row(s)


四、导出Hive表中数据到RDBMS中

##创建mysql表
CREATE TABLE `my_user2` (
  `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `account` varchar(255) DEFAULT NULL,
  `passwd` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);


mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| my_user        |
| my_user2       |
+----------------+
2 rows in set (0.00 sec)



##导入到mysql
bin/sqoop export 
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
--username root 
--password 123456 
--table my_user2 
--export-dir /user/hive/warehouse/user_hive 
--num-mappers 1 
--input-fields-terminated-by '	'


##mysql查询
mysql> select * from my_user2;
+----+---------+---------+
| id | account | passwd  |
+----+---------+---------+
|  1 | admin   | admin   |
|  2 | pu      | 12345   |
|  3 | system  | system  |
|  4 | zxh     | zxh     |
|  5 | test    | test    |
|  6 | pudong  | pudong  |
|  7 | qiqi    | qiqi    |
| 12 | beifeng | beifeng |
| 13 | xuanyun | xuanyu  |
+----+---------+---------+
9 rows in set (0.00 sec)
原文地址:https://www.cnblogs.com/weiyiming007/p/10824299.html