Sqoop 导入数据到hdfs和hive总结

 

  • 使用帮助

Sqoop help 查看所有的sqoop的帮助

Sqoop help import 查看import命令的帮助

 

Eg: sqoop导入到HDFS的一个简单示例:
sqoop import 
        --connect jdbc:mysql://192.168.56.121:3306/metastore 
        --username hiveuser 
        --password redhat 
        --table TBLS

 

  • 导入到HDFS

Eg:

sqoop import 
--connect jdbc:mysql://192.168.56.121:3306/metastore 
--username hiveuser 
--password redhat 
--table TBLS 
--target-dir /user/hive/result

注意:

  •  mysql jdbc url 请使用 ip 地址
  • 如果重复执行,会提示目录已经存在,可以手动删除
  • 如果不指定 --target-dir,导入到用户家目录下的 TBLS 目录

其他参数说明

参数

说明

--append

将数据追加到hdfs中已经存在的dataset中。使用该参数,sqoop将把数据先导入到一个临时目录中,然后重新给文件命名到一个正式的目录中,以避免和该目录中已存在的文件重名。

--as-avrodatafile

将数据导入到一个Avro数据文件中|

--as-sequencefile

将数据导入到一个sequence文件中

--as-textfile

将数据导入到一个普通文本文件中,生成该文本文件后,可以在hive中通过sql语句查询出结果。

--boundary-query <statement>

边界查询,也就是在导入前先通过SQL查询得到一个结果集,然后导入的数据就是该结果集内的数据,格式如:--boundary-query 'select id,no from t where id = 3',表示导入的数据为id=3的记录,或者 select min(<split-by>), max(<split-by>) from <table name>,注意查询的字段中不能有数据类型为字符串的字段,否则会报错

--columns<col,col>

指定要导入的字段值,格式如:--columns id,username

--direct

直接导入模式,使用的是关系数据库自带的导入导出工具。官网上是说这样导入会更快

--direct-split-size

在使用上面direct直接导入的基础上,对导入的流按字节数分块,特别是使用直连模式从PostgreSQL导入数据的时候,可以将一个到达设定大小的文件分为几个独立的文件。

--inline-lob-limit

设定大对象数据类型的最大值

-m,--num-mappers

启动Nmap来并行导入数据,默认是4个,最好不要将数字设置为高于集群的节点数

--query-e <sql>

从查询结果中导入数据,该参数使用时必须指定–target-dir–hive-table,在查询语句中一定要有where条件且在where条件中需要包含 \$CONDITIONS,示例:--query 'select * from t where \$CONDITIONS ' --target-dir /tmp/t –hive-table t

--split-by <column>

表的列名,用来切分工作单元,一般后面跟主键ID

--table <table-name>

关系数据库表名,数据从该表中获取

--delete-target-dir

删除目标目录

--target-dir <dir>

指定hdfs路径

--warehouse-dir <dir>

 --target-dir 不能同时使用,指定数据导入的存放目录,适用于hdfs导入,不适合导入hive目录

--where

从关系数据库导入数据时的查询条件,示例:--where "id = 2"

-z,--compress

压缩参数,默认情况下数据是没被压缩的,通过该参数可以使用gzip压缩算法对数据进行压缩,适用于SequenceFile, text文本文件, Avro文件

--compression-codec

Hadoop压缩编码,默认是gzip

--null-string <null-string>

可选参数,如果没有指定,则字符串null将被使用

--null-non-string <null-string>

可选参数,如果没有指定,则字符串null将被使用|


 

 

2.3 创建 hive

Eg:
sqoop 
        create-hive-table 
        --connect jdbc:mysql://192.168.56.121:3306/metastore 
        --username hiveuser 
        --password redhat 
        --table TBLS 

参数

说明

--hive-home <dir>

Hive的安装目录,可以通过该参数覆盖掉默认的hive目录

--hive-overwrite

覆盖掉在hive表中已经存在的数据

--create-hive-table

默认是false,如果目标表已经存在了,那么创建任务会失败

--hive-table

后面接要创建的hive

--table

指定关系数据库表名

导入数据到 hive

执行下面的命令会将 mysql 中的数据导入到 hdfs 中,然后创建一个hive 表,最后再将 hdfs 上的文件移动到 hive 表的目录下面。
sqoop import 
        --connect jdbc:mysql://192.168.56.121:3306/metastore 
        --username hiveuser --password redhat 
        --table TBLS 
        --fields-terminated-by "\t" 
        --lines-terminated-by "\n" 
        --hive-import 
        --hive-overwrite 
        --create-hive-table 
        --hive-table dw_srclog.TBLS 
        --delete-target-dir

 

具体可以参照:https://segmentfault.com/a/1190000002532293

 

关于sqoop的导出使用从hive中导出到mysql:

 

Sqoop export

--connect jdbc:mysql://xxxxxx:3306/bbg_real_data?characterEncoding=utf-8

--username root  #表示数据库用户名

--password root  #表示数据库密码

--table deal_data  #表示数据表名

--hcatalog-database default  #hive中的数据库名

--hcatalog-table deal_bbg_data_2  #表示hive中的表名

 

注意导出的时候,mysql的字段名要和hive里面的字段名一样,这样才能对应的导入和导出。字段类型也要一样,我全部都是varchar(40)。

Mysql表明和字段名不能是关键字例如:all等等

 

Hive tutorrials

  1. Create schema/table

Create schema[table] schema_name/table_name

  1. Delete schema/table

Drop  database[table] if exists database_name[table_name] 

 

Detail please look at as follow:

http://www.yiibai.com/hive/hive_drop_table.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章