今天碰到一个需求,大量的数据需要导入Postgres,作为一个小白,记录一下操作过程,以做记录

  • 背景1: 使用Postgres作为存储
  • 导入的文件:count.txt

问题1:装一个postgreSQL 用什么版本?

  • 这个问题是第一个问题,也是可能对后续操作有很大影响的步骤。
  • 踩坑一:使用了所谓的最新稳定版本postgres:12
1. 那这是一个坑,问题在于很多客户端软件的支持还没有到位,或者说我安装的版本支持并不好,2. 导致通过命令行建立的表在可视化中不可见,也就不能使用客户端软件类似于导入这一类的功能,因而失败3. 而且一些错误的提示百度而不得,对于小白加上需要解决问题的方面来说,理智的做法是更换版本,而不是追根究底一些原理或者去提一些issue求救之类的做法
  • 而后就放弃了尝鲜,换了最广泛使用的9.x版本,使用docker选了9.6版本,构建了简单的Postgres数据库,这也是比较成熟,支持的比较广泛的版本(在这个版本上没有发现客户端和命令行的不同步不可见问题);
docker 安装postgres
创建挂载卷:
docker volume create pgdata下载镜像:
docker pull postgres:9.6运行postgres:
docker run -it --rm -v pgdata:/var/lib/postgresql/data -p 5432:5432 --name postgres -d postgres:9.6

问题2:采用什么方式进行sql的导入?

  • 这个问题也是一个很重要的方向性决策,我的第一个想法是使用Java代码,原因是一些format可以调整,主键也可以自动生成插入,一切就会很顺利,然而操作起来并不是这样;
  • 问题一:用springboot写的接口,springboot(版本:2.0.4.RELEASE)对默认上传的问题大小有限制,默认1M,需要扩大需自行配置:
springservlet:(请注意这个参数,根据springboot版本的不同,可能在http,也可能在这个servlet下)multipart:max-file-size: 10MBmax-request-size: 10MB
  • 如果想继续执行,那么就要书写Excel导入的代码,这个成熟的代码真是太多了,springboot结合easypoi或者ExcelKit都是轻而易举,但是问题没有这么简单;
  • 当你正确的书写并执行,你就会看到,为什么导入的过程卡主迟迟没有响应?是程序的问题吗?
  • 那我原以为是某一个框架的问题,因而easypoi和ExcelKit我都有尝试,但是问题原来最终出在最基本的org.apache.poi,它的操作过程就是没有那么高效;
  • 根据网上也有人说,导入5000条就需要很久, 至少我等了一两分钟我的程序始终没有响应,那结论就是这个方法根本不可能支持大数据量;
  • 以上方法最终也被抛弃:
从整体角度来说,1. HTTP下上传下载文件都不应该是超大文件(除非文件系统),不应该随意的放宽文件上传下载的限制来占用大量内存读写;2. 并且Excel上传下载组件对大数据量的操作支持的可能性极低(需要进行百万级别量的交互);
  • 另外可能高效的方式,除却复杂的数据同步插件或者组件的使用,最基础的也就是数据库自身支持的数据导入导出了,对于比较局限的数据库导入导出操作如何实现上述的需求呢?
  • Excel的文件导入需要借用一下简单的客户端工具(当然靠命令都可以实现),选择"导入"-> “选择文件” -> “列的默认处理(日期之类的)” -> “列的字段映射” -> "导入形式(append)"然后就开始了,这个过程没有问题;
  • 相对比较迅速地导入了几十万的数据;
  • 查看表,确认字段映射和数据导入准确;

问题3:对于没有的字段如何补充?

  • 这个问题主要面对的是,如何填补主键,在传输过来的数据中,只有业务数据,那每一条数据对应需要基于一个递增或者UUID类型的主键,这个如何实现?
  • 目前的需求,主键是UUID
  • 方法一:使用create extension方式,下面详述;
  • 方法二:没有默认安装,需要导入SQL,psql -U postgres -f 安装路径/share/contrib/uuid-ossp.sql :
  • 以下是方法一的操作过程:
创建UUID扩展插件:
create extension "uuid-ossp";测试正常使用:
select uuid_generate_v4();如果有输出,那就没有问题了
  • create extension说明:
CREATE EXTENSION将新扩展加载到当前数据库中。 必须没有已加载的同名扩展。加载扩展基本上等于运行扩展的脚本文件。 该脚本通常会创建新的SQL对象,例如函数,数据类型,运算符和索引支持方法。另外,CREATE EXTENSION记录所有已创建对象的标识,以便在发出DROP EXTENSION时可以再次删除它们。加载扩展需要具有创建其组件对象所需的相同权限。 对于大多数扩展,这意味着需要超级用户或数据库所有者权限。 运行CREATE EXTENSION的用户将成为扩展的所有者,以便以后进行权限检查,以及扩展程序脚本创建的任何对象的所有者。
  • 接下来需要对上述导入完成的数据添加主键;
  • update xxx set id = uuid_generate_v4() where id is null;
  • 首先使用默认带中横线的UUID形式,再修改;
  • update xxx set id = (SELECT REPLACE(ID,’-’,’’)) where id like ‘%-%’;
  • 这几个步骤也比较顺利,能够正确的初始化id的值;

问题4:(新增的需求)如何从现有数据中提炼出省市的信息?

  • 提炼省和市,主要就是将省和市的字段进行组合并输出去重
  • SELECT distinct(concat_ws(’,’,province,city)) FROM “xxx”;
  • 导出到文件后,通过文件导入,建立树形结构的省市关系;

附录

1.docker宿主机和容器如何传输文件?

1、从容器里面拷文件到宿主机
docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 docker cp postgres:/opt/area.csv /xxx/xxx/xxx/xxx/2、从宿主机拷文件到容器里面
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径docker cp /opt/test.js tomcat:/xxx/xxx/xxx/xxxx/test/js

2.如何将postgres查询的结果输出到文件?

方法一:使用输出流的方式
  • 步骤一:\o test.txt, 打开一个文件
  • 步骤二:此时已经建立输出流,执行SQL即可将结果输出到文件,select * from a_txt;
  • 步骤三:\o ,关闭文件输出,如果不关闭,接下来的结果都会输出到你指定的文件,但是通过"\o"关闭了,就继续切换到屏幕输出结果
方法二:使用拷贝的方式
  • COPY (SELECT * FROM a_txt) TO ‘/tmp/query.csv’ (format csv, delimiter ‘,’)

3. 多字段合并输出?

  • 同一条数据中,将多个字段合并:concat_ws(’:’,a,b),a和b用冒号隔开
  • 同一个查询中,将多条结果合并:string_agg(c,’ \r\n '),每条数据c之间使用\r\n隔开
  • 组合操作:string_agg(concat_ws(’:’,a,b),’ \r\n ’ order by a asc) as result ,结果就是: 0:a \r\n 1:b

4. 一些postgres常用命令

\l  列出数据库\c test  切换数据库\d  列出数据表\d a_test  查看数据表

5.数据类型的映射

  • 在使用mysql的时候习惯了用LocalDate和LocalDateTime来记录时间,到了postgres并不可行;
  • mysql中:
程序中:LocalDate
mysql: date程序中:LocalDateTime
mysql: datetime
  • postgres中:
程序中:Date
postgres: date程序中:Date
postgres: timestamp程序中:Date
postgres: timestamptz(带时区)

6.部分参考列表

  • UUID的使用
  • postgres mysql的对比
  • navicat 导入MySQL 创建主键uuid

如果有朋友,对于大数据量导入的场景有经验的,欢迎留言交流,我一定好好学习~

postgres 导入纯文本数据txt相关推荐

  1. matlab如何导入多文本数据,将文本文件中的混合数据导入表

    样本文件概述 样本文件 outages.csv 包含表示美国电力中断的数据.文件的前几行如下: Region,OutageTime,Loss,Customers,RestorationTime,Cau ...

  2. navicat prem导入SQL文本数据

    使用navicat 导入sql数据

  3. 千寻的计算机字符,R语千寻 | 非结构化数据--文本数据的读入

    原标题:R语千寻 | 非结构化数据--文本数据的读入 " 上一期(),我们介绍了普通数据读入的方法,一般来说,如果你的数据够规矩,够整齐,按照我们上期介绍的方法,注意注意路径.分隔符等常见问 ...

  4. 纯文本抽出通用程序库 让您不再为文本抽出和处理发愁!

    该程序库可以从数十种数据文件格式中,将纯文本数据进行抽出,通过该程序库,用户可以轻松获得各种格式文档的文字信息,方便检索和处理. 功能: (1)文件自动识别:可识别源生成文件和其版本,文件的识别不是根 ...

  5. 数据格式转换(二)纯文本抽出

    DMCTextFilter是由北京红樱枫软件有限公司研制和开发的纯文本抽出通用程序库产品.本产品可以从各种各样的文档格式的数据中或从插入的OLE对象中,完全除掉特殊控制信息,快速抽出纯文本数据信息.便 ...

  6. Navicat怎样导入Excel表格和txt文本的数据

    Navicat怎样导入Excel表格数据 1. 准备excel数据表,第一行是字段名,第二到五行是数据 (1.当需要存储的字段为null时,对应的单元格不写  2.注意数据是在哪个工作表中,例如:下面 ...

  7. 将txt文本数据导入到Excel中

    1 txt文件如下,将txt中的数据导入到新建的Excel中(以office2016为例) 2 在Excel中选择数据.获取外部数据.自文本,选择要导入的文本 3 进入文本导入向导,共三步,根据自己的 ...

  8. Bulk Insert:将文本数据(csv和txt)导入到数据库中

    将文本数据导入到数据库中的方法有很多,将文本格式(csv和txt)导入到SQL Server中,bulk insert是最简单的实现方法 1,bulk insert命令,经过简化如下 BULK INS ...

  9. Oracle10表数据编辑器,Oracle ORACLE 快速批量导入文本数据到数据库(sqlldr工具)方法与分析 (Windows CMD 方式)...

    Oracle ORACLE 快速批量导入文本数据到数据库(sqlldr工具)方法与分析 (Windows CMD 方式) 在实际生产环境中,常会碰到将一些如通过通讯接口传过来的数据(文本文件 txt) ...

最新文章

  1. setTimeOut() 和 setTimeInterval()
  2. android顶部横线动态导航
  3. Nginx配置文件nginx.conf详解(转)
  4. VS2010 自定义用户控件未出现在工具箱的解决方案
  5. BZOJ3230 相似子串 字符串 SA ST表
  6. R语言的一个加法函数
  7. testNg自动化,读取excel的数据
  8. c++string函数(一)——find、rfind详细用法
  9. C语言基础之--sizeof()运算符的使用以及注意
  10. 数字地球与计算机技术联系,数字地球与地球空间信息科学的关系
  11. 容器技术Docker K8s 18 容器服务ACK基础与进阶-容器网络管理
  12. Python+selenium批量把网页文档保存为PDF
  13. 【3dmax千千问】初学3dmax插件神器第19课3dmax学习教程|疯狂模渲大师怎么使用Mental Ray渲染器?如何通过Mental Ray渲染效果图的出图表现?
  14. scikit-learn功能大全
  15. miui12系统小米系统安卓系统里面存储空间占用太多如何清理
  16. 单片机 重要英文缩写解释
  17. 安装Windows Outlook邮箱客户端
  18. 什么是独享锁/共享锁_java培训
  19. 「石墨文档」在线协同办公系统平台免费在线办公文档兼容Office
  20. WPS 合并一个工作簿中多个工作表

热门文章

  1. unity开发 宝箱掉落与产出
  2. 四次重启共享充电宝业务 美团终结“三电一兽”格局预言会成真吗?
  3. 目前最快速最好最有效的【淡化疤痕的方法】是什么
  4. 小数的二进制与十进制转换
  5. APP设计阅读:6本交互设计殿堂级的书籍
  6. 易语言API获取进程程序路径
  7. VMware 安装失败解决方案,亲测有效
  8. mysql数据中包含不间断空格(ascii值为194和160)解决办法
  9. 弘辽科技:商家直通车操作
  10. 左耳朵耗子:我做系统架构的一些原则