【Hadoop】关于Sqoop导出数据到postgresql时schema的设置问题

本文解决SQOOP导出PostgreSQL数据库特定模式数据的问题,详细介绍了如何在Java代码中正确设置--schema参数,确保数据能从指定模式导出到HDFS。

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

说明

使用sqoop导出导入数据非常的方便,但是对于postgresql(简称PG库)时就碰到了一个问题,pg库是三层结构的database——schema——table。如果想导入到某一个模式下,那就需要指定模式才可以。但是sqoop如何指定pg库的模式?

解决办法

碰到问题首先要看文档才对的。文档这里已经指出如何指定pg库的schema了。官方文档地址
文档已经说了,如果向指定schema需要添加-- --schema <name> 但是要注意的是必须在命令行的 !!!!最后!!! 添加才会生效。

在这里插入图片描述
但是,这是命令行的解决办法,如果我们使用的是java呢?在没解决之前,我的java代码是这样写的:

public static boolean ExportCmdInPg(Configuration conf, String tableName, List<String> columns, String hdfsDir,Map<String, String> dbMap) {
        try {
            LogUtils.logInfoPrint("开始任务",logger);
            List<String> list = new ArrayList<>();
            list.add("--connect");
            list.add(dbMap.get(Constant.DRIVERURL));
            list.add("--username");
            list.add(dbMap.get(Constant.USER));
            list.add("--password");
            list.add(dbMap.get(Constant.PASSWORD));
            list.add("--table");
            list.add(tableName);
            list.add("--columns");
            list.add(StringUtils.join(columns, ','));
            list.add("--fields-terminated-by");
            list.add("\t");
            list.add("--export-dir");
            list.add(hdfsDir);
            list.add("-m");
            list.add("1");
            ExportTool exporter = new ExportTool();
            Sqoop sqoop = new Sqoop(exporter);
            String[] data = list.toArray(new String[0]);
            if (0 == data.length) {
                LogUtils.logErrorPrint("sqoop参数为空,请检查ExportCmd方法!",logger);
                return false;
            }
            if (0 == Sqoop.runSqoop(sqoop, data)){
                return true;
            }
        }catch (Exception e){
            LogUtils.logErrorPrint("ExportCmd 导入到HDFS出现错误",logger,e);
        }
        return false;
    }

结果当然是不成功。那我哦添加-- --schema 参数试一下

public static boolean ExportCmdInPg(Configuration conf, String tableName, List<String> columns, String hdfsDir,Map<String, String> dbMap) {
        try {
            LogUtils.logInfoPrint("开始任务",logger);
            List<String> list = new ArrayList<>();
            list.add("--connect");
            list.add(dbMap.get(Constant.DRIVERURL));
            list.add("--username");
            list.add(dbMap.get(Constant.USER));
            list.add("--password");
            list.add(dbMap.get(Constant.PASSWORD));
            list.add("--table");
            list.add(tableName);
            list.add("--columns");
            list.add(StringUtils.join(columns, ','));
            list.add("--fields-terminated-by");
            list.add("\t");
            list.add("--export-dir");
            list.add(hdfsDir);
            list.add("-m");
            list.add("1");
            list.add("-- --schema");
            list.add("HERO");
            ExportTool exporter = new ExportTool();
            Sqoop sqoop = new Sqoop(exporter);
            String[] data = list.toArray(new String[0]);
            if (0 == data.length) {
                LogUtils.logErrorPrint("sqoop参数为空,请检查ExportCmd方法!",logger);
                return false;
            }
            if (0 == Sqoop.runSqoop(sqoop, data)){
                return true;
            }
        }catch (Exception e){
            LogUtils.logErrorPrint("ExportCmd 导入到HDFS出现错误",logger,e);
        }
        return false;
    }

结果也是不成功,显示报错不识别-- --schema 。。。为了能够使schema参数生效,废了我不少劲。。。也查了不少资料,但是查到的资料都没有关于java的schema的设置。所以。。。最终正确的解决办法是:

public static boolean ExportCmdInPg(Configuration conf, String tableName, List<String> columns, String hdfsDir,Map<String, String> dbMap) {
        try {
            LogUtils.logInfoPrint("开始sqoop将oracle的数据导出到HDFS目录",logger);
            List<String> list = new ArrayList<>();
            list.add("--connect");
            list.add(dbMap.get(Constant.DRIVERURL));
            list.add("--username");
            list.add(dbMap.get(Constant.USER));
            list.add("--password");
            list.add(dbMap.get(Constant.PASSWORD));
            list.add("--table");
            list.add(tableName);
            list.add("--columns");
            list.add(StringUtils.join(columns, ','));
            list.add("--fields-terminated-by");
            list.add("\t");
            list.add("--export-dir");
            list.add(hdfsDir);
            list.add("-m");
            list.add("1");
            // 注意这里是--是分开的,源码这里是通过--做判断的
            list.add("--");
            list.add("--schema");
            list.add("HERO");
            ExportTool exporter = new ExportTool();
            Sqoop sqoop = new Sqoop(exporter);
            String[] data = list.toArray(new String[0]);
            if (0 == data.length) {
                LogUtils.logErrorPrint("sqoop参数为空,请检查ExportCmd方法!",logger);
                return false;
            }
            if (0 == Sqoop.runSqoop(sqoop, data)){
                return true;
            }
        }catch (Exception e){
            LogUtils.logErrorPrint("ExportCmd 导入到HDFS出现错误",logger,e);
        }
        return false;
    }

当然你也可能会使用字符串数组,数组方式就要这样写了

// 这里只是举个示例
String[] string = new String[]{"--","--schema","HERO"}

so 问题解决,心情愉快。如果问题不解决,可能会憋一天。。。。

### HadoopSqoop数据导入导出的相关报告与使用指南 #### 一、Sqoop简介及其作用 Sqoop是一种用于在关系型数据库(RDBMS)和Hadoop生态系统之间高效传输大量数据的工具。其核心功能在于将数据从传统的关系型数据库迁移到Hadoop分布式文件系统(HDFS),或者反之亦然[^3]。 #### 二、Sqoop的工作机制 Sqoop通过将用户的导入或导出命令转化为MapReduce程序来完成数据传输任务。在此过程中,主要涉及对`InputFormat`和`OutputFormat`类别的自定义实现。值得注意的是,在大多数情况下,Sqoop仅利用Map阶段而省略了Reduce阶段,以此提高效率并减少不必要的资源消耗[^5]。 #### 三、数据导入操作详解 ##### (1)基本概念 数据导入是指将外部关系型数据库中的数据加载到HDFS上的过程。这一过程可以按需配置多种参数以满足不同的业务需求[^1]。 ##### (2)常用选项说明 - `--connect`: 指定JDBC连接字符串。 - `--username/--password`: 提供访问目标数据库所需的认证信息。 - `--table`: 明确要迁移的具体格名称。 - `--target-dir`: 设置HDFS目录路径作为最终存储位置。 示例代码如下所示: ```bash sqoop import \ --connect jdbc:mysql://localhost/testdb \ --username root \ --password secret \ --table employees \ --target-dir /user/hdfs/sqoop_imported_data ``` ##### (3)高级特性支持 除了基础的功能外,还支持诸如增量导入等功能,允许只同步新增加的部分记录而非整个的内容[^4]。 #### 四、数据导出操作解析 相对应地,数据导出则是指把已经存在于HDFS内的数据写回到指定的关系型数据库里去的操作模式[^2]。 同样存在一些重要的标志位可供调整优化性能现: - `-m`, 或者完整的形式为`--num-mappers`:控制并发度大小,默认值通常设为四; - `--export-dir`: 声明待转移出去的数据所在的确切地址; 举例如下: ```bash sqoop export \ --connect jdbc:mysql://localhost/target_db \ --username admin \ --password passw0rd \ --table destination_table \ --export-dir /path/to/export/data \ --input-fields-terminated-by ',' \ --lines-terminated-by '\n' ``` #### 五、注意事项及最佳实践建议 为了确保顺利完成每一次的数据交换活动,请务必遵循以下几点提示事项: - 验证网络连通状况良好无误; - 测试所使用的驱动版本兼容性正常运作; - 考虑设置合理的分区策略降低单次作业规模提升整体吞吐量水平等等[^5]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值