sqoop如何指定pg库的模式(方法详解)

目录
  • 说明
  • 解决办法

sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具。你可以通过sqoop把数据从数据库(比如mysql,oracle)导入到hdfs中;也可以把数据从hdfs中导出到关系型数据库中。sqoop通过Hadoop的MapReduce导入导出,因此提供了很高的并行性能以及良好的容错性。

sqoop适合以下的人群使用:

  • 系统和应用开发者
  • 系统管理员
  • 数据库管理员
  • 数据分析师
  • 数据工程师

说明

使用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 问题解决,心情愉快。如果问题不解决,可能会憋一天。。。。

本文分享自华为云社区《【Hadoop】关于Sqoop导出数据到postgresql时schema的设置问题》,作者:Copy工程师 。

到此这篇关于sqoop如何指定pg库的模式的文章就介绍到这了,更多相关sqoop指定pg库的模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决sqoop从postgresql拉数据,报错TCP/IP连接的问题

    问题: sqoop从postgresql拉数据,在执行到mapreduce时报错Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections 问题定位过程: 1.postgresql 5432端口已开放,执行任务的节点能telnet通,并且netcat测试通过 2.sqoop list-tables命令可正常执行,sq

  • Sqoop的安装与使用详细教程

    本文我们介绍一个非常好用的数据传输工具--Sqoop.Sqoop是一款开源的工具,主要用于在Hadoop与传统数据库间进行数据的传递,可以将一个关系型数据库(例如:MySQL,Oracle,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中.Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目.关注专栏<破茧成蝶--

  • sqoop如何指定pg库的模式(方法详解)

    目录 说明 解决办法 sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具.你可以通过sqoop把数据从数据库(比如mysql,oracle)导入到hdfs中:也可以把数据从hdfs中导出到关系型数据库中.sqoop通过Hadoop的MapReduce导入导出,因此提供了很高的并行性能以及良好的容错性. sqoop适合以下的人群使用: 系统和应用开发者 系统管理员 数据库管理员 数据分析师 数据工程师 说明 使用sqoop导出导入数据非常的方便,但是对于postgresql(简称

  • thinkPHP2.1自定义标签库的导入方法详解

    本文详细讲述了thinkPHP2.1自定义标签库的导入方法.分享给大家供大家参考,具体如下: TP的手册似乎跟不上节奏, 对自定义标签只是寥寥几句, 摸索了N久, 终于将自定义的标签进行了导入. 心得如下: 1. 情况:  新建自定义的标签库类: @.Mylib.Tag.TagLibTest - 懂TP的应该知道这代表的路径 使用Examples下的Tag演示文件 <?php // +--------------------------------------------------------

  • python图形开发GUI库wxpython使用方法详解

    一.python gui(图形化)模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建 Pyqt     :是python最复杂也是使用最广泛的图形化 Wx       :是python当中居中的一个图形化,学习结构很清晰 Pywin   :是python windows 下的模块,摄像头控制(opencv),常用于外挂制作 二.wx模块的安装: C:\Users\Administrator> pip install wxpython 三.图形化介绍   四.wx主

  • python词云库wordCloud使用方法详解(解决中文乱码)

    文章中的例子主要借鉴wordColud的examples,在文章对examples中的例子做了一些改动. 一.wordColud设计中文词云乱码 使用wordColud设计词云的时候可能会产生乱码问题,因为wordColud默认的字体不支持中文,所以我们只需要替换wordColud的默认字体即可正常显示中文. 1.中文词云乱码 我们使用simhei(黑体)来替换wordColud的默认字体. 2.替换默认字体 a.在字体文件*.tff字体文件(simhei.tff)拷贝到wordColud安装的

  • Python字符串及文本模式方法详解

    一.你想在字符串中搜索和匹配指定的文本模式 遗漏点:re模块其实也是帮助我们进行字符串处理的重要工具,我之前总是想着用内建的函数来处理,其实如果是复杂的文本和数据结构,re模块能帮助我们处理很多信息. 对于简单的字面模式,直接使用 str.replace() 方法即可,比如: >>> text = 'yeah, but no, but yeah, but no, but yeah' >>> text.replace('yeah', 'yep') 'yep, but no

  • Ruby多线程库(Thread)使用方法详解

    Thread是Ruby的线程库,Thread库已经内置在Ruby中,但如果想要使用线程安全的Queue.Mutex以及条件变量等,则需要手动require 'thread'. 主线程main 默认情况下,每个Ruby进程都具备一个主线程main,如果没有创建新的线程,所有的代码都将在这个主线程分支中执行. 使用Thread.main()类方法可获取当前线程组的主线程,使用Thread.current()可以获取当前正在执行的线程分支.使用Thread.list()可获取当前进程组中所有存活的线程

  • MongDB.Net工具库MongoRepository使用方法详解

    MongDB .Net工具库MongoRepository的简单使用. 最近研究了一下MongoDB数据库,并使用了开源的在.net环境下的一个类库,Mongo仓库.对于数据的一些简单的操作非常好用,特记录供后期参考. 具体的使用过程如下: 一.新建项目,在Nuget上获取库. 二.在配置文件中设置数据库地址 三.新建数据实体,并继承Entity,定义需要的字段 四.注意常见的几种字段属性的使用 [BsonElement("reName")] 用来重命名数据库中字段的名称. [Bson

  • MongoDB.Net工具库MongoRepository使用方法详解

    MongoDB .Net工具库MongoRepository的简单使用. 最近研究了一下MongoDB数据库,并使用了开源的在.net环境下的一个类库,Mongo仓库.对于数据的一些简单的操作非常好用,特记录供后期参考. 具体的使用过程如下: 一.新建项目,在Nuget上获取库. 二.在配置文件中设置数据库地址 三.新建数据实体,并继承Entity,定义需要的字段 四.注意常见的几种字段属性的使用 [BsonElement("reName")] 用来重命名数据库中字段的名称. [Bso

  • python读取csv文件指定行的2种方法详解

    csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格 就可以存储为csv文件,文件内容是: No.,Name,Age,Score 1,Apple,12,98 2,Ben,13,97 3,Celia,14,96 4,Dave,15,95 假设上述csv文件保存为"A.csv",如何用Python像操作Excel一样提取其中的一行,也就是一条记录,利用Python自带的csv模块,有2种方法可以实现: 方法一:reader 第一种方法使

  • Zabbix指定时间内变化值设置方法详解

    背景描述:在现有的一个负载均衡设备上存有某个指标是处于一个增值状态(只会不断增大不会减少,估计是一个计算总量的指标数值),但是总量计算的值参考意义不大,我更需要的是他在指定时间内的变化值. 原监控项,一个持续增量的数据.如图1,图2. 图1 图2 新增该监控项的每分钟变量数据.如图3,图4. 图3 oid不变,名称,键值自定义. 图4 在该新增监控项上新增预订步骤"简单更改".表示将前后(倒数一二)取值作差值运算.最后所得结果,如图5. 图5 以上就是本文的全部内容,希望对大家的学习有

随机推荐