首页 > 数据库 >Java实现greenplum数据库中csv文件的导入和导出

Java实现greenplum数据库中csv文件的导入和导出

时间:2022-08-31 20:46:10浏览次数:45  
标签:csv Java String greenplum connection null 数据库

Java实现greenplum数据库中csv文件的导入和导出

背景:greenplum数据库是在开源的PostgreSQL的基础上采用MPP架构实现的关系型分布式数据库,在使用greenplum数据库进行开发的过程中,遇到了需要将本地csv文件导入到远程greenplum数据库中的需求场景,查看官方文档后,发现greenplum中提供了COPY语法在在一个文件和一个表之间复制数据,但是这个语句必须要求csv和greenplum处于同一个机器内部,不适用于本地csv和远程greenplum数据库的情况。

解决方法

使用org.postgresql.copy.CopyManager来实现将本地csv文件导入greenplum数据库的操作。代码实现入下,其中涉及到的gp连接需要替换,实现除了csv导入gp外,还提供了gp导出csv。

public class CsvToGpUtils {

    private String url; // gp的连接地址

    private String username; // gp用户名

    private String password; // gp密码

    /**
     * 获取connection
     */
    public Connection getConnection(){
        Connection connection = null;
        try {
            // 注册postgresql驱动
            Class.forName("org.postgresql.Driver").newInstance();
            connection = DriverManager.getConnection(url, username, password);
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     *
     * @param filePath  文件路径
     * @param table   数据库表名,数据存储的目标地址
     * @throws Exception
     */
    public void copyFromFile(String filePath, String table)
            throws Exception {
        FileInputStream fileInputStream = null;
        Connection conn = null;
        BufferedReader file = null;
        try {
            conn = getConnection();
            CopyManager copyManager = new CopyManager((BaseConnection) conn);
            fileInputStream = new FileInputStream(filePath);
            String charsetName = "UTF-8";
            System.out.println("charsetName = " + charsetName);
            // 获取字符流
            file = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charsetName));
            // copy 语法,具体查看官方文档,STDIN:指定输入来自客户端应用
            String sql = "COPY " + table + "(column1, column2)  FROM STDIN  delimiter as',' csv header ";
            System.out.println("sql = " + sql);
            // 执行
            copyManager.copyIn(sql, file);
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(file!=null) {
                file.close();
            }
            if(conn != null) {
                conn.close();
            }
            System.out.println("执行完成");
        }
    }

    /**
     * 导出到文件
     * @param filePath
     * @param tableOrQuery 可以为tablename ,also (sql语句)
     * @return
     * @throws SQLException
     * @throws IOException
     */
    public long copyToFile(String filePath, String tableOrQuery)
            throws SQLException, IOException {

        FileOutputStream fileOutputStream = null;
        Connection connection = null;
        long count = 0;
        try {
            connection = getConnection();
            CopyManager copyManager = new CopyManager((BaseConnection)connection);
            fileOutputStream = new FileOutputStream(filePath);
            count = copyManager.copyOut("COPY (" + tableOrQuery + ") TO STDOUT  WITH DELIMITER ',' quote '\"' csv header", fileOutputStream);
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(connection != null) {
                connection.close();
            }
            System.out.println("执行完成");
        }
        return count;
    }

}

标签:csv,Java,String,greenplum,connection,null,数据库
From: https://www.cnblogs.com/yst001/p/16644452.html

相关文章

  • Java中“接口”可以作为方法的返回值吗?
    可以返回接口,接口虽然不能被实例化,但是接口的实现类都可以向上转型为接口。所谓面向接口编程是指我们在编写代码时对数据参数的定义尽量写成接口,待真正实现的时候再用实际......
  • Java常用类之StringBuffer、StringBuilder类
    由于String的特性:内容一旦声明则不可改变,如果要改变,改变的肯定是String的引用地址。那么如果一个字符串要经常改变,此时使用String就不太合适,从而使用StringBuffer或StringB......
  • 盘点当下最流行的 Java 工具
    最流行的工具并不一定是“最好的”,对于开发来说,什么是最好的,取决于使用场景。然而,当选择工具时,流行程度是不可忽视的一个重要因素,并不是因为工具的流行增加了其价值,而......
  • java使用Stream简单操作集合
     效果图  本项目使用springbootpom依赖<!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <v......
  • 2022-08-31 第二小组 张晟源(javaweb,el,jstl,分页查询)
    JavaWeb一,JSPJSP(全称JavaServerPages),运行在服务端的语言<%//java代码%>1.JSP脚本只能有java代码,在访问JSP时,JSP引擎翻译JSP页面中的脚本2.J......
  • 【Java】FileUtils-获取路径的所有文件(或文件夹)
    一、获取指定路径下的所有Excel文件packagecom.boulderaitech.utils;importjava.io.File;importjava.util.Arrays;publicclassFileUtil{publicstaticvo......
  • Java方法总结
    什么是方法何谓方法就是一个方法只完成一个功能,这样利于后期的扩展例子:publicstaticvoidmain(String[]args){  System.out.println(add(1,2));}pub......
  • 利用pandas 判断csv文件最大长度
    1.安装pandaspipinstallpandas-ihttps://mirrors.aliyun.com/pypi/simple/--trusted-host=mirrors.aliyun.com/pypi/simple importpandasaspddf=pd.rea......
  • 浅谈-java GUI-基础理论
    GUI:GraphicalUserInterface(图形用户接口)用图形的方式,用来显示计算机操作的界面Java为GUI提供的API都存在java.awt和javax.Swing两个包中java.awt包:awt是这三个......
  • JVM和java体系结构
    前言:JVM(JavaVirtualMachine)是java虚拟机,是java上层框架的基础,欲练神功,先练内功!JVM和java体系结构  一次编译,到处运行.跨平台   不同语言使用编译器......