1.131.15 Sqoop导出数据Export使用

一、export

1、export概述

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

[[email protected] 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:\n 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

##准备数据
[[email protected] ~]# touch /opt/datas/user.txt

[[email protected] ~]# vim !$
12,beifeng,beifeng
13,xuanyun,xuanyu

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

[[email protected] 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文件的方式
[[email protected] ~]# touch /opt/datas/imp-hive-user.sql
[[email protected] ~]# 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 ‘\t‘ ;

[[email protected] 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 ‘\t‘ --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 ‘\t‘

##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

时间: 2024-10-08 18:09:28

1.131.15 Sqoop导出数据Export使用的相关文章

sqoop导出数据到关系数据库export_fact_bi_browser_t_job.sh

#!/bin/bash #################################### code review [email protected] 20170504# System Name : 大数据智慧分析平台# Author : heguoxiu# Description : sqoop导出数据到oracle################################## #引用公共变量配置文件source /parse/opt/shell/public/public_tim

Sqooop- 使用Sqoop进行数据的导入导出

Sqoop是Apache旗下的一个开源框架,专门用来做数据的导入和导出. 官网:https://sqoop.apache.org/ Sqoop的安装非常简单,只需要把下载下来的tar包解压设置两个环境变量就可以了 1.安装部署 下载版本:sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 官网:http://mirror.bit.edu.cn/apache/sqoop/1.4.6/ 1.1把tar包解压到/usr/sqoop tar -xvzf sqoop-1.

sqoop从关系库导出数据到hive

[Author]: kwu sqoop从关系库导出数据到hive,sqoop支持条件查询关系库中的数到hive数据仓库中,并且字段无须与hive表中的字段一致. 具体实现的脚本: #!/bin/sh # upload logs to hdfs today=`date --date='0 days ago' +%Y-%m-%d` sqoop import --connect jdbc:mysql://10.130.2.6:3306/bdc_test --username lvwenjuan --p

sqoop关系型数据迁移原理以及map端内存为何不会爆掉窥探

序:map客户端使用jdbc向数据库发送查询语句,将会拿到所有数据到map的客户端,安装jdbc的原理,数据全部缓存在内存中,但是内存没有出现爆掉情况,这是因为1.3以后,对jdbc进行了优化,改进jdbc内部原理,将数据写入磁盘存储了. 原文和作者一起讨论: http://www.cnblogs.com/intsmaze/p/6775034.html 微信:intsmaze Sqoop是apache旗下一款"Hadoop和关系数据库服务器之间传送数据"的工具.Sqoop架构非常简单,

C#winform导出数据到Excel的类

1 /// <summary> 2 /// 构造函数 3 /// </summary> 4 public ExportData() 5 { 6 7 } 8 /// <summary> 9 /// 保存文件名 10 /// </summary> 11 private string savefilename = ""; 12 /// <summary> 13 /// 准备导出的数据容器 14 /// </summary>

hbase结合hive和sqoop实现数据指导mysql

hive综合hbase两个优势表中的:    1.实现数据导入到MYSQL. 2.实现hbase表转换为另外一张hbase表. 三个操作环节: 1.hbase关联hive作为外部表: Sql代码   CREATE EXTERNAL TABLE hive_device_app(row_key string,genera_type string,install_type string,label string,meid string,model string,pkg_name string,spec

.Net中导出数据到Excel

一.asp.net中导出Excel的方法: 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器.在Response输出时,t分隔的数据,导出Excel时,等价于分列,n等价于换行. 1.将整个html全部输出Excel 此法将html中所有的内容,如按钮,表格,图片等全部输出到Excel中. Response.Clear();        Response.Buffer=   true;

使用Exp和Expdp导出数据的性能对比与优化

1.前言 数据备份对信息系统的安全运行至关重要,我们的用户中,使用RMan或第三方专业备份软件的越来越多,但是很多用户仍然保留了传统的Exp作为备份策略的一部分,主要是由于这种备份方式简单易用,而且恢复到其他机器上也很方便,所以,虽然有其他的备份方式,但是Exp方式仍然会同时使用,甚至还有不少的用户只有这种备份方式. 随着用户的数据量增长,Exp导出方式存在的问题也日渐突出,主要就是耗时长,有的甚至超过3个小时,加上常见的后台自动作业:汇总表的计算,自动费用的计算,统计信息的收集等工作,使一个晚

python从mysql导出数据导excel

# coding:utf8 import sys reload(sys) sys.setdefaultencoding('utf8') # author: 'zkx' # date: '2018/3/11' # Desc:从数据库中导出数据到excel数据表中 #已封装,可以直接使用,只需更改sql语句即可 import xlwt import MySQLdb def export(host,user,password,dbname,table_name,outputpath): conn =