最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

「EMR 开发指南」之 Sqoop 使用说明

网站源码admin0浏览0评论

「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的描述

发布评论

评论列表(0)

  1. 暂无评论