这是黄文辉同学处女作,大家支持!
其他相关文章:元数据概念
Sqoop主要用来在Hadoop(HDFS)和关系数据库中传递数据,使用Sqoop,我们可以方便地将数据从关系型数据库导入HDFS,或者将数据从关系型数据库导入HDFS,或者将从HDFS导出到关系型数据库.
从数据库导入数据
参数 | 说明 |
---|---|
--append | 将数据追加到HDFS上一个已存在的数据集上 |
--as-avrodatafile | 将数据导入到Avro数据文件 |
--as-sequencefile | 将数据导入到SequenceFile |
--as-textfile | 将数据导入到普通文本文件(默认) |
--as-parquetfile | 将数据导入到parquetfile文件 |
--boundary-query <statement> | 边界查询,用于创建分片(InputSplit) |
--columns <col,col,col…> | 从表中导出指定的一组列的数据 |
--delete-target-dir | 如果指定目录存在,则先删除掉 |
--direct | 使用直接导入模式(优化导入速度) |
--direct-split-size <n> | 分割输入stream的字节大小(在直接导入模式下) |
--fetch-size <n> | 从数据库中批量读取记录数 |
--inline-lob-limit <n> | 设置内联的LOB对象的大小 |
-m,--num-mappers <n> | 使用n个map任务并行导入数据(默认是4个) |
-e,--query <statement> | 导入的查询语句 |
--split-by <column-name> | 指定按照哪个列去分割数据 |
--table <table-name> | 导入的源表表名 |
--target-dir <dir> | 导入HDFS的目标路径 |
--warehouse-dir <dir> | HDFS存放表的根路径 |
--where <where clause> | 指定导出时所使用的查询条件 |
-z,--compress | 启用压缩 |
--compression-codec <c> | 指定Hadoop的codec方式(默认gzip) |
--null-string <null-string> | 果指定列为字符串类型,使用指定字符串替换值为null的该类列的值 |
--null-non-string <null-string> | 如果指定列为非字符串类型,使用指定字符串替换值为nul |
2.基本使用说明
1)将表数据导入
sqoop import --connect jdbc:mysql://192.168.xx.xx:port/xxxx --username xxxx –password --table "t_user" --target-dir "/test/sqoop/table" -m 1 --as-textfile
说明:使用一个map任务将t_user这个表的数据从数据库中导入到--target-dir指定的hdfs目录下,以text格式保存.
注意:从oracle中导入数据时,table的表命必须要大写,否则会报该table找不到的错误.
2)按条件将表数据导入
sqoop import --connect jdbc:mysql://192.168.xx.xx:port/xxxx --username xxxx --password --table "t_user" --target-dir "/test/sqoop/table" -m 1 --as-textfile --columns “ID,NAME,AGE,PHONE”—where "DATE_FORMAT(createTime,'%Y%m%d')=${vdate}"
说明:在使用--columns中,指定的columns的字段中不能调用数据库函数,只能通过sql查询去调用数据库函数.
3)使用sql将表数据导入
sqoop import --connect jdbc:mysql://192.168.xx.xx:port/xxxx --username xxxx –password --target-dir "/test/sqoop/table" -m 1 --as-textfile -query “select id,name,age from t_user where age>10 and \$CONDITIONS” --split-by “id”
说明:使用sql时,最后要加上$CONDITIONS
符号.如果是双引号,则是\$CONDITIONS
.当使用--query参数进行导入时,必须使用--split-by参数来指定某个切分字段,
3.sqoop导入原理
1)导入原理
sqoop在导入过程中,需要使用--split-by指定的字段进行数据切分.sqoop会去最大和最小split-by字段值,然后根据-m(--num-mappers)这个参数确定切分数量.例如:对于split-by是int类型来说,如果select max(split-by),min(split-by) from得到分别为100和1,而—num-mappers=2.那么1到100的数据,就被切分成2条sql,分别是select * from table where split-by>=1 and split-by <=50和select * from table where split-by>=51 and split-by <=100 .之后将切分出来sql分配到不同的map进行数据导入处理.
2)sqoop转化sql
对于上文中使用sql将数据导入的命令,根据导入原理转化的sql为
‘select id,name,age from t_user where age>10 and $CONDITIONS’
其中$CONDITIONS替换为(1=0)
2.获取split-by的最大值和最小值
‘SELECT MIN(id),MAX(id) FROM (select id,name,age from t_user where age>10 and $CONDITIONS) AS t1’
其中$CONDITIONS替换为(1=1)
3.根据sqoop导入原理中的切分规则,将sql切分,执行切分后的sql获取数据
‘select id,name,age from t_user where age>10 and $CONDITIONS’
其中$CONDITIONS替换为(1=1)