「EMR 开发指南」之 Sqoop 使用说明
说明
本文描述问题及解决方法同样适用于 弹性 MapReduce(EMR)。
背景
Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间传输数据的开源工具。它允许用户在Hadoop分布式文件系统(HDFS)和外部结构化数据存储之间进行数据导入和导出操作。Sqoop的主要优势在于,它可以有效地将大量数据从关系数据库迁移到Hadoop环境中,以便进行大数据分析和处理。
sqoop tool
使用help命令查看sqoop工具列表
代码语言:javascript代码运行次数:0运行复制$ sqoop help
usage: sqoop COMMAND [ARGS]
Available commands:
codegen Generate code to interact with database records
create-hive-table Import a table definition into Hive
eval Evaluate a SQL statement and display the results
export Export an HDFS directory to a database table
help List available commands
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
import-mainframe Import mainframe datasets to HDFS
list-databases List available databases on a server
list-tables List available tables in a database
version Display version information
See 'sqoop help COMMAND' for information on a specific command.
查看具体工具的使用说明,输入命令sqoop help (tool-name)
; 例如 sqoop help import
.
codegen
将关系数据库的表映射为一个java文件、java class类、以及相关的jar包
使用方法:
代码语言:txt复制sqoop codegen --connect jdbc:mysql://localhost:3306/hive --username root --password 123456 --table m_table
参数 | 说明 |
---|---|
--bindir <dir> | 编译后的输出路径 |
--class-name <name> | 生成的Java类名 |
--jar-file <file> | 关闭 code generation,使用指定的jar |
--outdir <dir> | 生成的java源文件路径 |
--package-name <name> | 包名,如com.tencent,则会生成com和tencent两级目录,生成的文件就存 放在tencent目录里 |
--map-colum-java <arg> | 覆盖字段默认从SQL类型到java类型的映射,多字段使用逗号分隔,例如:--map-column-java name=String,id=Integer |
--table <table-name> | 对应关系数据库的表名,生成java类中的各字段与该表对应。 |
create-hive-table
生成与关系数据库表的表结构对应的hive表
基础语句:
代码语言:txt复制sqoop create-hive-table --connect jdbc:mysql://localhost:3306/hive --username root --password 123456 --table m_table --hive-table h_table
参数 | 说明 |
---|---|
--hive-home <dir> | Hive的安装目录,可以通过该参数覆盖掉$HIVE_HOME |
--hive-overwrite | 覆盖掉在hive表中已经存在的数据 |
--create-hive-table | 如果目标表已经存在了,创建任务会失败,默认是false |
--hive-table | hive表名 |
--table | 关系数据库表名 |
eval
可以快速地使用SQL语句对关系数据库进行操作,结果显示在控制台,这可以使得在使用import进行数据导入时,预览结果是否符合预期
查询示例:
代码语言:txt复制sqoop eval --connect jdbc:mysql://localhost:3306/hive --username root --password 123456 -query "SELECT * FROM table1 LIMIT 1"
数据插入示例:
代码语言:txt复制sqoop eval --connect jdbc:mysql://localhost:3306/hive --username root --password 123456 -e "INSERT INTO table2 VALUES(123,'apple')"
export
从hdfs中导出数据文件到关系型数据库。目标表必须已经存在于关系型数据库中,hdfs上的文件将按照用户指定的分隔符进行解析。
执行该命令后,默认会将文件记录转换成INSERT语句将数据写入数据库。执行“update mode”时,sqoop会生成UPDATE语句替换数据库中的表记录。执行“call mode”时,sqoop将会为每条数据生成存储过程
代码语言:txt复制sqoop export --connect jdbc:mysql://localhost:3306/mydb --username root --password 123456 --table table1 --export-dir sqoop/test
参数 | 说明 |
---|---|
--direct | 快速模式,某些数据库(如mysql)为导入导出提供了快速模式,比jdbc连接的方式更为高效 |
--export-dir <dir> | 存放数据的hdfs目录 |
-m,--num- mappers <n> | 启动n个map任务来并行导入,默认为4个 |
--table <table-name> | 目标关系型数据库表 |
--update-key <col-name> | 更新时使用的key,如果有多个字段,使用逗号分隔 |
--update-mode <mode> | 更新模式,可选值为updateonly(仅更新目标表)和默认的allowinsert(除了更新目标表外,还允许插入) |
--input-null-string <null-string> | 字符串类型的字段,被解析为null的字符串 |
--input-null-non-string <null-string> | 非字符串类型的字段,被解析为null的字符串 |
--staging-table <staging-table-name> | 写入过程的中间表,结构与目标表相同,在运行数据导入前,数据会将结果先存放在该表中,然后最后由该表通过一次事务将结果写入到目标表中,保证事务的完整性 |
--clear-staging-table | 如果该staging-table非空,则通过该参数可以在运行导入前清除staging-table里的数据。 |
--batch | 批量SQL模式 |
help
打印sqoop帮助信息
语句:sqoop help
import
支持将关系型数据库表的数据导入到hdfs、hive、hbase和Accumulo
代码语言:txt复制sqoop import --connect jdbc:mysql://localhost:3306/hive --username root --password 123456 --table user --split-by id --hive-import
--split-by指定数据库表中的主键字段名,在这里为id。
参数 | 说明 |
---|---|
--append | 将数据追加到hdfs中已经存在的dataset中。使用该参数,sqoop将把数据先导入到一个临时目录中,然后重新给文件命名到一个正式的目录中,以避免和该目录中已存在的文件重名。 |
--as-avrodatafile | 将数据导入到一个Avro数据文件中 |
--as-sequencefile | 将数据导入到一个sequence文件中 |
--as-textfile | 将数据导入到一个普通文本文件中 |
--boundary-query <statement> | 创建分片时的边界查询,默认为select min(<split-by>), max(<split-by>) from |
公共参数
Hive参数
参数 | 说明 |
---|---|
--hive-delims-replacement <arg> | 用自定义的字符串替换掉数据中的\n, \r, and \01等字符 |
--hive-drop-import-delims | 在导入数据到hive中时,去掉数据中\n,\r和\01这样的字符 |
--map-column-hive <arg> | 生成hive表时,可以更改生成字段的数据类型,格式如:--map-column-hiveTBL_ID=String,LAST_ACCESS_TIME=string |
--hive-partition-key | 创建分区,后面直接跟分区名即可,创建完毕后,通过describe 表名可以看到分区名,默认为string型 |
--hive-partition-value<v> | 该值是在导入数据到hive中时,与--hive-partition-key设定的key对应的value值。 |
--hive-home <dir> | Hive的安装目录,可以通过该参数覆盖掉默认的hive目录 |
--hive-import | 将数据从关系数据库中导入到hive表中 |
--hive-overwrite | 覆盖掉在hive表中已经存在的数据 |
--create-hive-table | 默认是false,如果目标表已经存在了,那么创建任务会失败 |
--hive-table | 后面接要创建的hive表 |
--table | 指定关系数据库表名 |
数据库连接参数
参数 | 说明 |
---|---|
--connect <jdbc-uri> | Jdcb连接url,示例如:--connect jdbc:mysql://localhost:3306/hive |
--connection-manager <class-name> | 指定要使用的连接管理类 |
--driver <class-name> | 数据库驱动类 |
--hadoop-home <dir> | Hadoop根目录 |
--help | 打印帮助信息 |
-P | 从控制端读取密码 |
--password <password> | Jdbc url中的数据库连接密码 |
--username <username> | Jdbc url中的数据库连接用户名 |
--verbose | 在控制台打印出详细信息 |
--connection-param-file <filename> | 一个记录着数据库连接参数的文件 |
文件输出参数
用于import场景。
示例如:
代码语言:txt复制sqoop import --connect jdbc:mysql://localhost:3306/test --username root --P --table person --split-by id --check-column id --incremental append --last-value 1 --enclosed-by '\"' --escaped-by # --fields-terminated-by .
参数 | 说明 |
---|---|
--enclosed-by <char> | 给字段值前后加上指定的字符,比如双引号,示例:--enclosed-by ‘\”‘,显示例子:”3″,”jimsss”,”dd@dd” |
--escaped-by <char> | 给双引号作转义处理,如字段值为”测试”,经过--escaped-by \处理后,在hdfs中的显示值为:\”测试\”,对单引号无效 |
--fields-terminated-by <char> | 设定每个字段是以什么符号作为结束的,默认是逗号,也可以改为其它符号,如句号.,示例如:--fields-terminated-by. |
--lines-terminated-by <char> | 设定每条记录行之间的分隔符,默认是换行,但也可以设定自己所需要的字符串,示例如:--lines-terminated-by ‘#’ 以#号分隔 |
--mysql-delimiters | Mysql默认的分隔符设置,字段之间以,隔开,行之间以换行\n隔开,默认转义符号是\,字段值以单引号’包含起来。 |
--optionally-enclosed-by <char> | enclosed-by是强制给每个字段值前后都加上指定的符号,而--optionally-enclosed-by只是给带有双引号或单引号的字段值加上指定的符号,故叫可选的。示例如:--optionally-enclosed-by ‘显示结果:′显示结果:”hehe”,测试$ |
文件输入参数
对数据格式的解析,用于export场景,与文件输出参数相对应。
示例如:
代码语言:txt复制sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person2 --export-dir /user/hadoop/person --staging-table person3 --clear-staging-table --input-fields-terminated-by ‘,’
在hdfs中存在某一格式的数据,在将这样的数据导入到关系数据库中时,必须要按照该格式来解析出相应的字段值,比如在hdfs中有这样格式的数据:
代码语言:txt复制3,xxx,xx@xx,1,2013-08-07 16:00:48.0,”hehe”,测试
上面的各字段是以逗号分隔的,那么在解析时,必须要以逗号来解析出各字段值,如:
代码语言:txt复制--input-fields-terminated-by ','
参数 | 说明 |
---|---|
--input-enclosed-by <char> | 对字段值前后有指定的字符,比如双引号的值进行解析:--input-enclosed-by ‘\”‘,数据例子:”3″,”jimsss”,”dd@dd” |
--input-escaped-by <char> | 对含有转义双引号的字段值作转义处理,如字段值为\”测试\”,经过--input-escaped-by \处理后,解析得到的值为:”测试”,对单引号无效。 |
--input-fields-terminated-by <char> | 以字段间的分隔符来解析得到各字段值,示例如:--input-fields-terminated-by, |
--input-lines-terminated-by <char> | 以每条记录行之间的分隔符来解析得到字段值,示例如:--input-lines-terminated-by ‘#’ 以#号分隔 |
--input-optionally-enclosed-by <char> | 与--input-enclosed-by功能相似,与--input-enclosed-by的区别参见输出参数中对--optionally-enclosed-by的描述 |
发布评论