sqoop数据导入导出应用案例

sqoop数据导入导出应用案例

1 sqoop导入数据

将RDBMS中的一个表数据导入到hdfs。表中的每一行被视为hdfs的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)。

1.1 语法

下面的命令用于将数据导入到hdfs上。

$sqoop import (generic-args) (import-args)

1.2 测试数据

在MySQL有一个userdb的数据库,其中有一张usertable表,该表结构如下:

id name age
2 tom 15
3 toms 25
4 tomslee 17
5 bob 16

1.3 导入表中数据到HDFS

下面的命令用于从MySQL数据库服务器中的usertable表导入数据到hdfs。

sqoop import \
--connect jdbc:mysql://mysqlhost:3306/userdb \
--username root \
--password root \
--table usertable \
--m 1

上面的命令中--connect指的是连接地址,这里面是mysql服务器的地址;--table usertable是MySQL数据库的数据表;--m 1是指定MapReduce的数量。

如果执行成功,会显示如下输出:

14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
-----------------------------------------------------
O mapreduce.Job: map 0% reduce 0%
14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%
14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec)
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.

上述的过程由于没有指定hdfs的保存位置,所以系统会分配一个默认的地址,该地址根据当前的用户名和表名生成的。

为了验证在hdfs导入的数据,使用下面的命令可以查看:

hadoop fs -cat /user/hadoop/userdb/part-m-00000

默认情况下hdfs上面的数据字段之间用逗号(,)分割。

sqoop1

1.4 导入到hive表中

sqoop import \
--connect jdbc:mysql://mysqlhost:3306/userdb \
--username root \
--password root \
--table usertable \
--hive-import \
--m 1;

调用上述命令之前不用先建立hive数据表,由于没有指定hive的数据库,所以系统会在hive的default数据库下面建立一张usertable数据表。

数据传输过程:

1 从MySQL到hdfs上(通过MapReduce)
2 从hdfs迁移到hive中

hive> select * from usertable;
OK
2       tom     15
3       toms    25
4       tomslee 17
5       bob     16
Time taken: 0.191 seconds, Fetched: 4 row(s)
hive> dfs -cat /user/hive/warehouse/usertable/part-m-00000;
2tom15
3toms25
4tomslee17
5bob16
hive>

通过查看hdfs上的数据可知hive中的字段之间默认是用'\001'进行分割的,所以字段之间看起来紧挨着。

1.5 导入到hdfs指定的目录上

在导入表数据到hdfs使用sqoop工具,我们可以指定目标目录。

以下是指定目标目录选项的sqoop导入命令到的语法。

--target-dir<new directory in HDFS>

下面的命令是用来导入MySQL数据库的user数据表到hdfs的/user/test目录。

sqoop import \
--connect jdbc:mysql://mysqlhost:3306/userdb \
--username root \
--password root \
--target-dir /uer/test \
--table usertable \
--m 1;

注意指定的hdfs的目录不能存在,因为sqoop会将这个目录作为MapReduce的输出目录。
导入到hdfs上的输出数据格式如下:

2,tom,15
3,toms,25
4,tomslee,17
5,bob,16

1.6 导入表数据子集

我们可以导入表的"where"子句的一个子集通过sqoop工具。它执行在各自的数据库服务器相应的sql查询中,并将结果储存在hdfs的目标目录上。

where子句的语法如下:

--where <condition>

下面的命令用来 导入usertable表的数据子集。子集查询用户的姓名和年龄。

sqoop import \
--connect jdbc:mysql://mysqlhost:3306/userdb \
--username root \
--password root \
--table usertable \
--where "name='tom' and age=15" \
--target-dir /user/test \
--m 1;

注意指定的hdfs的目录不能存在,因为sqoop会将这个目录作为MapReduce的输出目录。

导入到hdfs上的输出数据格式如下:

2,tom,15

1.7 增量导入数据

增量导入是仅导入新添加的表中的行的技术。

它需要添加'incremental','check-column','last-value'选项来执行增量导入。

下面的语法用于sqoop导入命令 增量的选项。

--incremental <mode>
--check_column <column name>
--last-value <last check column value>

下面命令用于在user表执行增量导入。

sqoop import \
--connect jdbc:mysql://mysqlhost:3306/userdb \
--username root \
--password root \
--table usertable \
--incremental append \
--check-column id \
--last-value 2 \
--target-dir /user/test \
--m 1;

注意: 这里面指定的hdfs路径不但可以存在而且在该目录下还可以有文件存在。

2 sqoop数据导出

将数据从hdfs导出到RDBMS数据库。

导出前,目标表必须存在于目标数据库中。

默认操作是从将文件中的数据使用insert语句插入到mysql数据表中。
更新模式下,是生成update语句更新表数据。

2.1 语法

以下是export命令的语法。

sqoop export (generic-args) (export-args)

2.2 案例一

将hdfs中的数据导出到MySQL的usertable表中。

sqoop export \
--connect jdbc:mysql://mysqlhost:3306/userdb \
--username root \
--password root \
--table usertable \
-export-dir /user/hive/warehouse/usertable \
--input-fields-terminated-by '\001'
--m 1;

上述命令中的input-fields-terminated-by '\001'指的是输入的字段之间的分隔符,在hive中的默认分隔符为'\001'。

验证:在MySQL中输入select * from usertable;

3 sqoop数据导入导出命令详解

3.1 sqoop import导入数据命令参数详解

输入sqoop import --help命令可以查看所有导入命令的参数详解:


常用命令:
   --connect <jdbc-uri>                         JDBC连接字符串                                         
   --connection-manager <class-name>            连接管理者                                             
   --driver <class-name>                        驱动类
   --hadoop-home <dir>                          指定$HADOOP_HOME路径
   -P                                           从命令行输入密码(这样可以保证数据库密码的安全性)
   --password <password>                        密码
   --username <username>                        用户名
   --verbose                                    打印信息


Import control arguments:
   --append                        添加到hdfs中已经存在的dataset上
                                   直接使用该参数就可向一个已经存在的目录追加内容了
   --as-avrodatafile               导入数据作为avrodata
   --as-sequencefile               导入数据作为SequenceFiles
   --as-textfile                   默认导入数据为文本
   --boundary-query <statement>    Set boundary query for retrieving max
                                   and min value of the primary key
   --columns <col,col,col...>      选择导入的列
   --compression-codec <codec>     压缩方式,默认是gzip
   --direct                        使用直接导入快速路径
   --direct-split-size <n>         在快速模式下每n字节使用一个split
-e,--query <statement>             通过查询语句导入
   --fetch-size <n>                一次读入的数量                            
   --inline-lob-limit <n>          Set the maximum size for an inline LOB
-m,--num-mappers <n>               通过实行多少个map,默认是4个,某些数据库8 or 16性能不错
   --split-by <column-name>        创建split的列,默认是主键
   --table <table-name>            导入的数据表
   --target-dir <dir>              HDFS 目标路径
   --warehouse-dir <dir>           HDFS parent for table destination
   --where <where clause>          WHERE clause to use during import
-z,--compress                      Enable compression


增量导入参数:
   --check-column <column>        Source column to check for incremental
                                  change
   --incremental <import-type>    Define an incremental import of type
                                  'append' or 'lastmodified'
   --last-value <value>           Last imported value in the incremental
                                  check column

输出行格式参数:
   --enclosed-by <char>               设置字段结束符号
   --escaped-by <char>                用哪个字符来转义
   --fields-terminated-by <char>      输出字段之间的分隔符
   --lines-terminated-by <char>       输出行分隔符
   --mysql-delimiters                 使用mysql的默认分隔符: , lines: \n escaped-by: \ optionally-enclosed-by: '

   --optionally-enclosed-by <char>    Sets a field enclosing character

输入参数解析:
   --input-enclosed-by <char>               Sets a required field encloser
   --input-escaped-by <char>                Sets the input escape
                                            character
   --input-fields-terminated-by <char>      输入字段之间的分隔符
   --input-lines-terminated-by <char>       输入行分隔符
                                            char
   --input-optionally-enclosed-by <char>    Sets a field enclosing
                                            character

Hive arguments:
   --create-hive-table                         创建hive表,如果目标表存在则失败

   --hive-delims-replacement <arg>             导入到hive时用自定义的字符替换掉 \n, \r, and \001

   --hive-drop-import-delims                   导入到hive时删除 \n, \r, and \001
   --hive-home <dir>                           重写$HIVE_HOME
   --hive-import                               Import tables into Hive
                                               (Uses Hive's default
                                               delimiters if none are
                                               set.)
   --hive-overwrite                            Overwrite existing data in
                                               the Hive table
   --hive-partition-key <partition-key>        hive分区的key
   --hive-partition-value <partition-value>    hive分区的值
                                              
   --hive-table <table-name>                   Sets the table name to use
                                               when importing to hive
   --map-column-hive <arg>                     类型匹配,sql类型对应到hive类型

3.2 sqoop export导出数据命令参数详解

输入sqoop export --help命令可以查看所有导入命令的参数详解:

export主要参数
--direct     快速导入
--export-dir <dir>                            HDFS到处数据的目录
-m,--num-mappers <n>                          都少个map线程
--table <table-name>                          导出哪个表
--call <stored-proc-name>                     存储过程
--update-key <col-name>                       通过哪个字段来判断更新
--update-mode <mode>                          插入模式,默认是只更新,可以设置为allowinsert.
--input-null-string <null-string>             字符类型null处理
--input-null-non-string <null-string>         非字符类型null处理
--staging-table <staging-table-name>          临时表
--clear-staging-table                         清空临时表
--batch                                       批量模式

4 参考博文

http://www.cnblogs.com/cenyuhai/p/3306056.html

http://www.aboutyun.com/thread-9983-1-1.html

http://blog.csdn.net/wangyang1354/article/details/52936400

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容