摘要:sqoop如何指定pg库的模式?

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

说明

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

点击关注,第一时间了解华为云新鲜技术~

sqoop如何指定pg库的模式的更多相关文章

  1. sqoop与PG库导入导出数据

    导入数据到Hive sqoop import --connect jdbc:postgresql://172.66.6.666/radar5g4h --username postgres --pass ...

  2. Sqoop export参数updatemode两种模式updateonly和allowinsert区别

    1.更新导出(updateonly模式)1.1参数说明-- update-key,更新标识,即根据某个字段进行更新,例如id,可以指定多个更新标识的字段,多个字段之间用逗号分隔. -- updatem ...

  3. Excel数据导入PG库,字符串正则表达式

    1.Excel数据导入到PG库的某张表中:先将Excel文件转换为CSV格式,打开SQL Shell(psql),连接数据库(输入server,database,Port,username),然后再执 ...

  4. Linux下gcc编译生成动态链接库*.so文件并调用它(注:执行Test程序后无需用export 命令指定.so库文件路径:方法在文中下方;)

    动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...

  5. gcc -rpath 指定动态库路径

    gcc -rpath 指定动态库路径 http://blog.csdn.net/v6543210/article/details/44809405

  6. @font-face引用指定字体库(一)

    创建 文件夹 font 存放指定字体库 在css文件中使用字体库: html, body{ font-family: "Microsoft YaHei",Arial,Helveti ...

  7. linux 给运行程序指定动态库路径

    1. 连接和运行时库文件搜索路径到设置 库文件在连接(静态库和共享 库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/li ...

  8. 开启PG的归档模式

    目录 开启PG的归档模式 1.查看pg的数据目录 2.查看pg的归档情况 3.查看归档的模式和位置 4.建立归档目录 5.配置归档参数 6.重启pg 7.查看&&切换归档日志 8.查看 ...

  9. redis 指定db库导入导出数据

    最近根据之前的项目重新改编一个新的项目,发现上一个项目的搭建者,把一些区域权限和划分放在redis上存储,因此不得不照搬过来,所以搜索一下相关如何做的 发现一个比较简单的做法,记录一下操作过程,方便以 ...

随机推荐

  1. 总结Vue第一天:简单介绍、基本常用知识、辅助函数

    总结Vue第一天:简单介绍.基本常用知识.辅助函数 中文官网:https://cn.vuejs.org/v2/guide/syntax.html 遇到不熟悉的可以先看一下官网,然后再看一下一些别人写的 ...

  2. Visual Studio之__cplusplus版本

    1. 默认值 Visual Studio(下文简称VS)中__cplusplus宏的默认值一直是: 199711L 可以用下面的代码查看 __cplusplus 的输出结果: #pragma once ...

  3. 【LeetCode】70. Climbing Stairs 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目大意 题目大意 解题方法 递归 记忆化搜索 动态规划 空间压缩DP 日期 [L ...

  4. 【LeetCode】713. Subarray Product Less Than K 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/subarray ...

  5. 【LeetCode】923. 3Sum With Multiplicity 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/3sum-wit ...

  6. 【LeetCode】761. Special Binary String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/special- ...

  7. B. The Meeting Place Cannot Be Changed

    B. The Meeting Place Cannot Be Changed time limit per test 5 seconds memory limit per test 256 megab ...

  8. 【项目管理】《IT项目管理》Kathy Schwalbe 第2章 IT项目管理和IT背景

    1.对项目管理采取系统的观点有何意义?如何在项目管理中采用系统的观点? 意义:有效处理复杂的环境 采用系统方法,系统分析,系统管理.2.解释组织的四个框架.他们是如何帮助项目经理理解项目的组织环境的? ...

  9. 贪心学院计算机视觉CV训练营

    贪心学院计算机视觉CV训练营 任务 Notes 其他 任务1:机器学习.深度学习简介 Note1 任务2:深度学习的发展历史 Note2 任务3:现代深度学习的典型例子 Note3 任务4:深度学习在 ...

  10. Vue.js高效前端开发 • 【Vue列表渲染】

    全部章节 >>>> 文章目录 一.v-for指令 1.v-for指令使用 2.实践练习(待更新) 二.计算属性 1.计算属性创建和使用 2.实践练习(待更新) 三.侦听属性 1 ...