三、Sqoop 全量导入核心命令 - 实践

news/2025/10/7 9:06:02/文章来源:https://www.cnblogs.com/tlnshuju/p/19128185

三、Sqoop 全量导入核心命令 - 实践

2025-10-07 09:05  tlnshuju  阅读(0)  评论(0)    收藏  举报

作者:IvanCodes
日期:2025年6月3日
专栏:Sqoop教程

Sqoop 的全量导入 (Full Import) 是指将关系型数据库中整个表特定查询结果集所有数据一次性完整地导入到 Hadoop 生态系统 (通常是 HDFS 或 Hive) 中。

一、核心命令结构 (sqoop import)

执行全量导入的基本命令框架如下:

sqoop import \
--connect <jdbc-connect-string>\--username <db-username>\--password <db-password>\# (或使用 --password-file / -P)# --- 数据源指定 ---[--table <db-table-name>] \[--query <sql-query> --target-dir <hdfs-path>-m <num-mappers>[--split-by <column-name>]] \# --- 导入目标指定 ---[--target-dir <hdfs-path>] \[--warehouse-dir <hdfs-base-path-for-hive>] \[--hive-import --hive-table <hive-db.table_name>[--create-hive-table] [--hive-overwrite]] \# --- 并行度与分割 ---[-m <num-mappers>] \[--split-by <column-name>] \# --- 文件格式与压缩 ---[--fields-terminated-by '<char>'] \[--as-textfile | --as-sequencefile | --as-avrodatafile | --as-parquetfile] \[--compress --compression-codec <codec>] \# --- 其他常用选项 ---[--delete-target-dir] \[--verbose]

二、关键参数详解 (带示例)

  1. 连接参数 (Connection Parameters)
  • --connect <jdbc-connect-string>: 数据库的JDBC连接URL
    • 示例 (MySQL):
--connect jdbc:mysql://localhost:3306/mydatabase
  • --username <db-username>: 数据库用户名
    • 示例:
--username retail_user
  • --password <db-password>: 数据库密码生产环境强烈建议使用 --password-file /path/to/passwordfile-P (交互式输入密码)。
    • 示例 (不推荐直接写密码): --password 123456
    • 示例 (推荐): -P (执行时会提示输入)
  1. 数据源指定 (Data Source) - 至少提供一种
  • --table <db-table-name>: 要导入的数据库表名
    • 示例:
--table products
  • --query "<sql-query>": 使用自定义的SQL查询来选择要导入的数据。
    • 示例:
--query "SELECT id, name, price FROM items WHERE status = 'active' AND \$CONDITIONS"
  • 注意:使用 --query 时,必须同时提供 --target-dir <hdfs-path> (如果导入到HDFS) 和 -m <num-mappers>。如果 -m > 1,查询中必须包含 \$CONDITIONS 占位符,并通常需要 --split-by。如果 -m 1,则 \$CONDITIONS不是必需的
  1. 导入目标 (Import Target) - 至少提供一种
  • --target-dir <hdfs-path>: 指定数据导入到HDFS的目录
    • 示例:
--target-dir /user/cloudera/imported_data/products_text
  • --warehouse-dir <hdfs-base-path-for-hive>: 指定Hive仓库的根目录。当与 --hive-import 结合使用时,Sqoop 会在此目录下创建与表名对应的子目录
    • 示例:
--warehouse-dir /user/hive/warehouse
  • --hive-import: 指示Sqoop将数据导入到Hive表中。
  • --hive-table <hive-db.table_name>: 指定目标Hive数据库和表名
    • 示例:
--hive-table retail_stage.products_from_mysql
  • --create-hive-table: (可选) 如果目标Hive表不存在,Sqoop会根据源表结构自动创建它。
  • --hive-overwrite: (可选) 如果目标Hive表已存在,此选项会覆盖表中的现有数据
  1. 并行度与数据分割 (Parallelism & Splitting)
  • -m <num-mappers> (或 --num-mappers <num-mappers>): 指定用于导入数据的Map任务数量。默认通常是4。

  • --split-by <column-name>: 指定用于分割数据以供并行Map任务处理的列。该列最好是数值类型、日期类型或具有均匀分布的字符类型,并且有索引

  1. 文件格式与压缩 (File Format & Compression)
  • --fields-terminated-by '<char>': 指定字段分隔符
    • 示例:
--fields-terminated-by '\t' # Tab分隔
--fields-terminated-by '|' # 线分隔
  • --as-textfile | --as-sequencefile | --as-avrodatafile | --as-parquetfile: 指定存储格式

  • --compress --compression-codec <codec>: 启用压缩并指定压缩编解码器。

    • 示例:
--compress --compression-codec snappy
  1. 其他常用选项
    • --delete-target-dir: 如果目标HDFS目录已存在,则先删除它再导入。谨慎使用!
    • --verbose: 输出更详细的执行日志。
    • --direct: (仅支持部分数据库如MySQL, PostgreSQL) 使用数据库特定的批量加载工具绕过MapReduce,通常速度更快

三、全量导入MySQL表数据示例

场景: 假设我们有一个MySQL数据库 testdb,其中有一个表 products (id INT PRIMARY KEY, name VARCHAR(255), price DECIMAL(10,2), category VARCHAR(100))。

1. 全量导入MySQL表数据到HDFS

(A) 导入为默认文本文件 (逗号分隔) 到HDFS

sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
-password 123456 \
--table products \
--target-dir /user/cloudera/products_hdfs_text_default \
-m 2 \
--split-by id
  • 说明:数据将以逗号分隔的文本文件形式存储在HDFS的 /user/cloudera/products_hdfs_text_default 目录下。使用2个mapper并行导入,并根据 id 列进行数据切分。

(B) 导入为制表符分隔的文本文件到HDFS,并启用Snappy压缩

sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
-P \
--table products \
--target-dir /user/cloudera/products_hdfs_tsv_snappy \
--fields-terminated-by '\t' \
--compress \
--compression-codec snappy \
-m 4 \
--split-by id
  • 说明:数据将以制表符分隔,并使用Snappy压缩

© 导入为Avro数据文件到HDFS

sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
-P \
--table products \
--target-dir /user/cloudera/products_hdfs_avro \
--as-avrodatafile \
-m 2 \
--split-by id
  • 说明:数据将以Avro格式存储,Sqoop会自动生成相应的Avro schema。

2. 全量导入MySQL表数据到Hive

(A) 导入到Hive,如果表不存在则创建 (默认文本格式)

sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
-P \
--table products \
--hive-import \
--hive-table default.products_from_mysql_text \
--create-hive-table \
-m 2 \
--split-by id
  • 说明:数据将导入到 default 数据库下的 products_from_mysql_text Hive表中。如果表不存在,Sqoop会根据MySQL表结构自动创建。HDFS上的数据文件将位于默认的Hive仓库路径下(通常是 /user/hive/warehouse/products_from_mysql_text/)。

(B) 导入到Hive并覆盖现有表,指定存储为Parquet格式

sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
-P \
--table products \
--hive-import \
--hive-table default.products_from_mysql_parquet \
--create-hive-table \
--hive-overwrite \
--as-parquetfile \
-m 4 \
--split-by id
  • 说明:数据将以Parquet列式存储格式导入到Hive。如果 products_from_mysql_parquet 表已存在,其内容将被覆盖

© 使用自定义查询导入特定数据到Hive

sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
-P \
--query "SELECT id, name, category FROM products WHERE price > 100.00 AND \$CONDITIONS" \
--split-by id \
--hive-import \
--hive-table default.expensive_products \
--create-hive-table \
--target-dir /user/cloudera/temp/expensive_products_staging \
# --query时,若hive-import,也建议指定一个临时的--target-dir
-m 2
  • 说明:仅导入 products 表中价格大于100的产品的 id, name, 和 category 列。\$CONDITIONS允许Sqoop并行化这个自定义查询。为 --query 导入到Hive时,显式指定 --target-dir 作为数据在HDFS上的暂存位置通常是个好习惯,Sqoop随后会将这些数据加载到Hive表中。

四、执行流程与核心点

  1. 元数据探查:Sqoop连接数据库,获取表结构信息。
  2. 代码生成:自动生成Java类以映射表记录。
  3. MapReduce作业:(非--direct模式) 将导入任务转化为MapReduce作业。Map任务并行读取数据库数据分片并写入HDFS/Hive。
  4. 数据一致性:全量导入期间,源表若持续写入新数据,导入结果可能非严格事务快照。建议在业务低峰期操作。
  5. 数据库压力高并发导入会增加源数据库负载,需合理设置 -m
  6. 类型映射:关注数据库类型到Hadoop类型的自动映射,特殊类型可能需要手动调整

练习题与解析

假设环境:

  • MySQL数据库 sales_db,包含表 transactions (trans_id INT PRIMARY KEY, product_sku VARCHAR(50), sale_amount DECIMAL(12,2), trans_date DATE, region_id INT)。
  • Hadoop集群已配置。
  • MySQL连接信息:jdbc:mysql://dbserver.mycompany.com:3306/sales_db,用户 sales_importer,密码通过密码文件 /user/sqoop_user/sales.password 获取。

题目:

  1. 练习题1:HDFS导入 - 指定分隔符和压缩
    请编写Sqoop命令,将 sales_db.transactions 表的所有数据全量导入到HDFS的 /data_lake/raw/sales_transactions 目录下。使用4个Map任务,并以 trans_id 列进行数据分割。文件字段间使用逗号 , 分隔,并且使用Gzip压缩

  2. 练习题2:Hive导入 - 创建新表并指定数据类型
    请编写Sqoop命令,将 sales_db.transactions 表中 region_id5sale_amount 大于 500所有交易数据全量导入到Hive。目标Hive表为 processed_sales.high_value_region5_txns。如果该Hive表不存在,则自动创建它,并确保 sale_amount 在Hive中映射为 DOUBLE 类型,trans_date 映射为 DATE 类型。如果表已存在,则覆盖其内容。数据在Hive中以Avro格式存储。

解析:

  1. 练习题1答案与解析:
sqoop import \
--connect jdbc:mysql://dbserver.mycompany.com:3306/sales_db \
--username sales_importer \
--password-file /user/sqoop_user/sales.password \
--table transactions \
--target-dir /data_lake/raw/sales_transactions \
-m 4 \
--split-by trans_id \
--fields-terminated-by ',' \
--compress \
--compression-codec gzip
  • --password-file /user/sqoop_user/sales.password: 使用HDFS上的密码文件,这比直接在命令行写密码更安全
  • --table transactions: 指定导入源表
  • --target-dir /data_lake/raw/sales_transactions: HDFS目标路径
  • -m 4 --split-by trans_id: 使用4个mapper并行处理,按 trans_id 分割
  • --fields-terminated-by ',': 字段以逗号分隔
  • --compress --compression-codec gzip: 启用Gzip压缩
  1. 练习题2答案与解析:
sqoop import \
--connect jdbc:mysql://dbserver.mycompany.com:3306/sales_db \
--username sales_importer \
--password-file /user/sqoop_user/sales.password \
--query "SELECT trans_id, product_sku, sale_amount, trans_date, region_id FROM transactions WHERE region_id = 5 AND sale_amount > 500 AND \$CONDITIONS" \
--split-by trans_id \
--map-column-hive sale_amount=DOUBLE,trans_date=DATE \
--hive-import \
--hive-table processed_sales.high_value_region5_txns \
--create-hive-table \
--hive-overwrite \
--as-avrodatafile \
--target-dir /user/hive/warehouse/processed_sales.db/high_value_region5_txns_temp \
-m 2
  • --query "...": 使用自定义查询筛选数据,并包含 \$CONDITIONS 以支持并行。
  • --split-by trans_id: 指定查询结果集如何分割给mappers。
  • --map-column-hive sale_amount=DOUBLE,trans_date=DATE: 关键参数,用于在创建Hive表时,将源表中的 sale_amount 列映射为Hive的 DOUBLE 类型,trans_date 列映射为Hive的 DATE 类型
  • --hive-import --hive-table ... --create-hive-table --hive-overwrite: 导入到Hive,不存在则创建,存在则覆盖
  • --as-avrodatafile: 指定数据以Avro格式存储
  • --target-dir ..._temp: --query 导入到Hive指定一个临时的HDFS暂存目录
  • -m 2: 使用2个mapper。对于自定义查询,mapper数量需要根据数据量和 --split-by 列的特性来合理设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

喀什做网站wordpress活动召集插件

spark的集群主要有三种运行模式standalone、yarn、mesos&#xff0c;其中常被使用的是standalone和yarn&#xff0c;本文了解一下什么是standalone运行模式&#xff0c;并尝试搭建一个standalone集群 一、standalone模式 standalone模式&#xff0c;是spark自己实现的&#xf…

手机怎么做优惠券网站怎么样黑进网站后台

----------------| 本文目录 |---------------- 1. 进程1.1 基本概念1.2 描述进程 - PCB1.2.1 task_struct - PCB的一种1.2.2 task_struct 内容分类 1.3 组织进程1.4 查看进程1.5 通过系统调用获取进程标示符1.6 通过系统调用创建进程 - fork初识 2. 进程状态2.1 看看Linux内核…

网站备案注销找哪个部门网站建设 阳江

时光飞逝&#xff0c;一转眼24年的第一个季度已经过去了&#xff0c;回望这3个多月&#xff0c;感触颇多。首先&#xff0c;24年从一个一心只读圣贤书&#xff0c;全身心投入在技术上的研发工程师&#xff0c;转变为一个团队的小leader。从我个人对自己的定位来说&#xff0c;我…

SAP ABAP 事务码 RZ12 里的 Max Number of WPs Used 参数的作用介绍

在 SAP 系统中,Max Number of WPs Used 参数在事务码 RZ12 中的 RFC 服务器组配置中扮演了非常关键的角色。这个参数定义了在该服务器组中可以使用的工作进程(Work Process, WP)的最大数量。工作进程是 SAP 系统中执…

中国煤炭建设协网站wordpress怎么装修网页

为什么要学习设计模式&#xff1f; 要知道设计模式就是软件工程的方法经验的总结&#xff0c;也是可以认为是过去一段时间软件工程的一个最佳实践&#xff0c;要理解&#xff0c;不要死记硬背。掌握这些方法后&#xff0c;可以让你的程序获得以下好处&#xff1a; 代码重用性…

建设银行 北京招聘网站学校如何建设网站

1. 引言 本文将从Web应用程序处理请求时需要用户信息&#xff0c;同时HTTP又是无状态协议这个矛盾点出发。从该问题出发&#xff0c;简单描述了解决该问题的Token 机制&#xff0c;进而引出Cookie的实现方案。 基于此我们将详细描述Cookie的规范&#xff0c;然后详细描述具体…

广州专业的网站建设公司哪家好黄骅在线

刚刚接触Mendix低代码两周&#xff0c;花了一周在b站看初级视频然后考完初级&#xff0c;第二周开始做个列表查询感觉照葫芦画瓢没啥难度。但最近要求写个导出列表数据&#xff0c;在mendix社区翻了翻&#xff0c;这个功能算是常见的。找了mendix官方提供的Docs磕磕盼盼才实现了…

busybox 没有 clear 命令吗

是的,BusyBox 默认不包含 clear 命令。 替代方案 1. 使用 echo 命令bash 复制下载echo -e "\033c"或者bash 复制下载printf "\033c"2. 使用快捷键 在终端中按 Ctrl + L 也可以清屏 3. 创建别名…

实用指南:Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法

实用指南:Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

高阶数据结构——并查集 - 详解

高阶数据结构——并查集 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

网站建设方案范文网站建设详细报价

继续炒股。第一题是买卖股票的最佳时机IIIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/&#xff0c;与上题不同的是&#xff0c;本题要求买卖的次数要限制在2次以内。对上题的dp数组&#xff0c;显然要增加它的状态以适应题目要求。对于遍历…

经过基于流视频预测的可泛化双手运行基础策略

经过基于流视频预测的可泛化双手运行基础策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

公司网站打不开微博+wordpress

1. 不说负能量的话&#xff0c;会引发自己的负能量 在日常生活中&#xff0c;我们的语言不仅能够影响他人&#xff0c;更能影响我们自己。负能量的话语&#xff0c;如抱怨、批评或消极的自我对话&#xff0c;会潜移默化地影响我们的心态和情绪。为了维持积极的心态&#xff0c…

进程——环境变量及软件地址空间

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

软件开发与网站开发的区别网站落地页如何做

/*java中的集合类 实现了 Connection接口ArrayList这个集合类 java.util.*这个包的类toArray()方法可以返回一个 Object类型的对象数组我们部队 ArratList进行泛型规范那么就会警告 但是还是可以运行的这是因为JDK1.5中引进了泛型&#xff0c;但是你的ArrayList却没有采用&a…

高唐做网站建设的公司小皮怎么创建网站

目录 题目答案运行结果 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组…

自己可做以做网站吗天元建设集团有限公司商票兑付情况

520这一天&#xff0c;也是网络情人节。就在那天&#xff0c;如果没有女朋友的自己&#xff0c;如何假装自己是有朋友的&#xff01;如何在朋友圈“秀恩爱。女生版&#xff1a;image很有感觉有木有~~男生版&#xff1a;imageimage其实这些都是小意思啦~~这些都是假装自己有女朋…

【HarmonyOS 5】鸿蒙Taro跨端框架 - 教程

【HarmonyOS 5】鸿蒙Taro跨端框架 - 教程2025-10-07 08:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

遵义祥云平台网站建设中国企业500强排名2021

《童年》是高尔基自传体小说三部曲中的第一部&#xff0c;讲述的是高尔基幼年丧父、母亲改嫁&#xff0c;他跟随日渐破落的小染坊主外公以及外婆生活的童年经历。小说通过一个儿童天真无邪的眼光&#xff0c;向读者生动地展示了19世纪中叶俄罗斯社会底层人民的生活状态&#xf…

学习unigui【37】nginx的反向代理 ,程序中的重新定向

学习unigui【37】nginx的反向代理 ,程序中的重新定向默认port:9077 希望IP:81后访问9077。于是就采用nginx。问题当点击下载文件或浏览文件等时,怎么知道用户是通过81口访问的? UniGUI 没有暴露 RequestHeader(s),…