
摘要本文详细解析了使用 Apache Sqoop 将数据从 MySQL 导入到 Apache Hive 的完整流程。内容涵盖核心原理、必选与可选参数详解、两种主流导入方法直接导入与导入 HDFS的典型命令示例以及关键的注意事项。旨在帮助读者快速掌握 Sqoop 数据迁移的核心技能。一、核心原理Sqoop 将数据从关系型数据库如 MySQL导入到 Hadoop 生态的 Hive 数据库其核心过程分为两步数据抽取与传输Sqoop 通过 JDBC 连接 MySQL将数据抽取并传输到 Hadoop 分布式文件系统HDFS上。数据加载将 HDFS 上的数据文件加载到 Hive 的数据仓库中完成数据迁移。理解这一“两步走”的架构是掌握后续参数和命令的基础。二、参数详解Sqoop 命令的参数分为必选和可选两大类正确配置是成功导入的关键。2.1 必选参数以下参数是执行导入操作时必须指定的--connect jdbc-url指定 MySQL 数据库的 JDBC 连接信息。--username nameMySQL 数据库的登录账户。--password pwdMySQL 数据库的登录密码。--table table-name指定要导出的源关系数据库表名。--hive-import启用此标志表示目标是将数据导入 Hive。2.2 常用可选参数以下参数可根据具体场景灵活选用以优化导入过程输出格式控制--as-textfile将数据导入为普通文本文件默认。--as-sequencefile将数据导入为 SequenceFile 格式。--as-avrodatafile将数据导入为 Avro 数据文件。数据筛选与映射--columns col1,col2,...指定要导入的字段列表。--where condition指定导入数据的查询条件例如--where id 100。--query select-statement通过自定义 SQL 查询语句导入数据需与--target-dir配合使用。Hive 相关--hive-table table-name目标 Hive 表名。--hive-database db-name目标 Hive 数据库名。--hive-overwrite导入前清空目标 Hive 表中的所有数据。--hive-partition-key key指定 Hive 表的分区字段类型默认为 string。--hive-partition-value value与--hive-partition-key配合指定导入的分区值。性能与存储-m或--num-mappers n指定并行执行的 Map 任务数默认为 4。--split-by column-name指定用于数据分片的字段以实现并行导入。--target-dir hdfs-path指定数据导入 HDFS 时的目标目录。--delete-target-dir如果目标目录已存在则先删除。数据格式处理--fields-terminated-by char指定字段分隔符如,。--lines-terminated-by char指定行分隔符如\n。--null-string string指定字符串类型为 NULL 时的替代字符。--null-non-string string指定非字符串类型为 NULL 时的替代字符。--hive-drop-import-delims导入到 Hive 时删除数据中的\n、\r、\01等特殊字符。三、实战方法根据 Sqoop 的工作原理主要有两种将 MySQL 数据导入 Hive 的方法。3.1 方法一直接导入此方法通过--hive-import参数将 MySQL 数据直接导入到指定的 Hive 表中Sqoop 会自动完成 HDFS 暂存和 Hive 加载两步。典型命令示例sqoop import \ --connect jdbc:mysql://localhost:3306/bdp \ --username root \ --password bdp \ --table emp \ --hive-import \ --hive-database test \ --hive-table EMP \ --where id 10 \ --hive-partition-key time \ --hive-partition-value 2018-05-18 \ --null-string \\N \ --null-non-string \\N \ --fields-terminated-by , \ --lines-terminated-by \n \ -m 1适用场景适用于将单个 MySQL 表中的部分或全部数据直接导入到 Hive 表的情况操作简洁。3.2 方法二导入 HDFS 再加载此方法分为两步先将数据导入 HDFS再通过 Hive 的LOAD DATA命令将数据加载到 Hive 表。适用于需要复杂数据预处理或跨表查询的场景。步骤 1导入数据到 HDFSsqoop import \ --connect jdbc:mysql://localhost:3306/bdp \ --username root \ --password bdp \ --query SELECT * FROM emp INNER JOIN user ON emp.iduser.id WHERE $CONDITIONS \ --split-by id \ --target-dir /user/data/mysql/emp \ -m 1步骤 2加载数据到 Hive 表# 在 Hive 中执行 LOAD DATA INPATH /user/data/mysql/emp INTO TABLE test.EMP2;适用场景适用于需要从多张 MySQL 表 JOIN 后导入复杂数据集的场景灵活性更高。四、关键注意事项分隔符一致性通过--fields-terminated-by和--lines-terminated-by指定的分隔符必须与目标 Hive 表的定义完全一致否则会导致数据加载后字段值为 NULL。字段映射使用--columns参数时指定的 MySQL 字段必须与目标 Hive 表的字段在名称、顺序和数据类型上对应否则会引发异常。分区限制--hive-table参数仅支持单个静态分区通过--hive-partition-key和--hive-partition-value指定。如需多分区应使用--hcatalog-table、--hcatalog-database、--hcatalog-partition-keys和--hcatalog-partition-values参数。更新限制Hive 本身不支持行级更新UPDATE因此 Sqoop 导入 Hive 的数据只能进行追加Append或覆盖Overwrite操作无法实现增量更新。