关于sqoop --split-by 及 -m的理解

本文深入探讨了使用Sqoop从PostgreSQL导入数据到Hive时,数据量出现非预期倍增的现象,并分析了原因。通过实例展示了split-by字段类型、值分布对导入效率的影响,提出了解决方案包括调整split-by设置和优化导入参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]场景:[/b]

sqoop import --connect jdbc:postgresql://...../..... --username .... --query "select * from retail_tb_order_qiulp_test where status = 'TRADE_FINISHED' or status = 'TRADE_CLOSED' or status = 'TRADE_CLOSED_BY_TAOBAO' and \$CONDITIONS" --hive-import -m 6 --hive-table custom_analyse_db.retail_tb_order_main --hive-overwrite --hive-partition-key part --hive-partition-value qiulp --target-dir /user/qiulp/test1 --split-by tid
注意红色字体部分, retail_tb_order_qiulp_test表原有1000条数据,导入hive后成了6000条,是map的倍数关系。
如下图,一条数据在hive中有6条相同的数据:

[b]理解[/b]
1.split-by 根据不同的参数类型有不同的切分方法,如int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域。比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers(-m)为2的话,则会分成两个区域 (1,500)和(501-1000),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000.最后每个map各自获取各自SQL中的数据进行导入工作。

2.当split-by不是int型时出现如上场景中的问题。目前想到的解决办法是:将-m 设置称1,split-by不设置,即只有一个map运行,缺点是不能并行map录入数据。(注意,当-m 设置的值大于1时,split-by必须设置字段)

3.split-by即便是int型,若不是连续有规律递增的话,各个map分配的数据是不均衡的,可能会有些map很忙,有些map几乎没有数据处理的情况
MySQL数据导入至HDFS中 1、简单导入。 sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student 这里没有指定 HDFS 的目录 默认会将数据存到系统当前登录用户下 以表名称命名的文件夹下。 系统默认为逗号隔开,如下图: 注意:如果数据库没有设置主键,语法需要加上--split by指定一个列去分割或用-m 1指定一个 Map 任务。 2、指定 HDFS 目录/user/root/hdfsdb导入,指定一个 MapReduce 任务。 sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --usernameroot --password 123123 --table student --target-dir /user/root/hdfsdb -m 1 --target-dir:指定 HDFS 目录。 -m 1:指定一个 MapReduce 任务。 3、指定查询学生的学号与学生姓名存入到/user/root/hdfsdb2中,指定一个MapReduce 任务,并以|分隔。 sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_no, stu_name from student where $CONDITIONS' --target-dir /user/root/hdfsdb2 --fields-terminated-by '|' -m 1 --query:通过用 sql 语句来将数据导入,where $CONDITIONS是query中固定语法,不可删去。 --fields-terminated-by:数据通过什么来隔开。 编程要求 根据上述,将 MySQL 数据库hdfsdb中的表数据导入至HDFS中,要求如下: 指定 HDFS 目录/user/root/hdfsdb3。 查询学生姓名与年龄。 指定一个 Mapreduce 任务。 存储以-来分割。
最新发布
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值