我们在往数据仓库中填充数据的第一步,就是要把RDBMS中的表导入到HDFS中。基于MapReduce的Sqoop工具可以很方便的将关系型数据库中的表导入到Hive、HBase中,并且记录可以以文本文件(每行一条记录)存储,也可以以Avro或SequenceFiles的二进制格式存储。
Sqoop命令
sqoop import \
--connect jdbc:mysql://host:3306/mysqldb?autoReconnect=true&tinyInt1isBit=false&zeroDateTimeBehavior=round \
--username user_name \
--password-file /home/sqoop/password \
--hive-import \
--hive-database hivedb \
--hive-table hivetable \
--query "select id,user_id,user_name from mysql_table where (updated_at >= '2019-04-19 00:00:00') and \$CONDITIONS" \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-drop-import-delims \
--map-column-java id=String,user_id=String,user_name=String
--target-dir /tmp \
--as-parquetfile \
--fields-terminated-by '^' \
-m 1
参数详解
- –connect: 要连接的服务器和数据库
- –username: 数据库连接用户名
- –password-file: 数据库连接密码。也可以使用参数–password(直接将密码写在参数后面)或-P(控制台输入),但是向数据库提供密码的安全方式是将密码保存在用户目录下的一个文件中,并赋予400权限。
- –hive-import: 导入表到Hive
- –hive-database: 指定要导入的Hive数据仓库名
- –hive-table: 指定要导入的Hive表名
- –query: 导入指定的statement查询结果
- –null-string: 对于string类型的列,要转换成null的字符串。具体含义:因为在默认情况下,Sqoop会将NULL值导入为null字符串(“null”),但是Hive使用字符串\N("\N")来表示NULL值,因此谓词处理将不能正确工作(像is null)。如果希望将MySQL中的NULL导入到Hive之后还同样是NULL,可添加参数–null-string和–null-non-string。
- –null-non-string: 对于非string类型的列,要转换为null的字符串,含义同上。
- –hive-drop-import-delims: 如果你的数据库的行包含具有Hive默认行分隔符(\n和\r字符)或列分隔符(\01字符)的字符串字段,则在Sqoop-import导入时会出现问题。可以使用–hive-drop-import-delims选项在导入时删除这些字符,以提供与Hive兼容的文本数据。或者也可以使用–hive-delims-replacement选项,使用用户定义的导入字符替换这些字符。
- –map-column-java: Sqoop预先配置为将大多数SQL类型映射到合适的Java或Hive类型,然而,默认的映射并不能适用于所有情况,可以使用–map-column-java选项覆盖用于将映射更改为Java或使用–map-column-hive选项覆盖用于更改Hive映射。
- –target-dir: MapReduce job指定在HDFS上的输出目录
- –as-parquetfile: 导入数据为parquet格式的文件
- –fields-terminated-by: 字段分隔符
- -m: 控制map任务数量,也就是并行度