postgres 导入纯文本数据txt
生活随笔
收集整理的這篇文章主要介紹了
postgres 导入纯文本数据txt
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天碰到一個(gè)需求,大量的數(shù)據(jù)需要導(dǎo)入Postgres,作為一個(gè)小白,記錄一下操作過程,以做記錄
- 背景1: 使用Postgres作為存儲(chǔ)
- 導(dǎo)入的文件:count.txt
問題1:裝一個(gè)postgreSQL 用什么版本?
- 這個(gè)問題是第一個(gè)問題,也是可能對(duì)后續(xù)操作有很大影響的步驟。
- 踩坑一:使用了所謂的最新穩(wěn)定版本postgres:12
- 而后就放棄了嘗鮮,換了最廣泛使用的9.x版本,使用docker選了9.6版本,構(gòu)建了簡(jiǎn)單的Postgres數(shù)據(jù)庫,這也是比較成熟,支持的比較廣泛的版本(在這個(gè)版本上沒有發(fā)現(xiàn)客戶端和命令行的不同步不可見問題);
問題2:采用什么方式進(jìn)行sql的導(dǎo)入?
- 這個(gè)問題也是一個(gè)很重要的方向性決策,我的第一個(gè)想法是使用Java代碼,原因是一些format可以調(diào)整,主鍵也可以自動(dòng)生成插入,一切就會(huì)很順利,然而操作起來并不是這樣;
- 問題一:用springboot寫的接口,springboot(版本:2.0.4.RELEASE)對(duì)默認(rèn)上傳的問題大小有限制,默認(rèn)1M,需要擴(kuò)大需自行配置:
- 如果想繼續(xù)執(zhí)行,那么就要書寫Excel導(dǎo)入的代碼,這個(gè)成熟的代碼真是太多了,springboot結(jié)合easypoi或者ExcelKit都是輕而易舉,但是問題沒有這么簡(jiǎn)單;
- 當(dāng)你正確的書寫并執(zhí)行,你就會(huì)看到,為什么導(dǎo)入的過程卡主遲遲沒有響應(yīng)?是程序的問題嗎?
- 那我原以為是某一個(gè)框架的問題,因而easypoi和ExcelKit我都有嘗試,但是問題原來最終出在最基本的org.apache.poi,它的操作過程就是沒有那么高效;
- 根據(jù)網(wǎng)上也有人說,導(dǎo)入5000條就需要很久, 至少我等了一兩分鐘我的程序始終沒有響應(yīng),那結(jié)論就是這個(gè)方法根本不可能支持大數(shù)據(jù)量;
- 以上方法最終也被拋棄:
- 另外可能高效的方式,除卻復(fù)雜的數(shù)據(jù)同步插件或者組件的使用,最基礎(chǔ)的也就是數(shù)據(jù)庫自身支持的數(shù)據(jù)導(dǎo)入導(dǎo)出了,對(duì)于比較局限的數(shù)據(jù)庫導(dǎo)入導(dǎo)出操作如何實(shí)現(xiàn)上述的需求呢?
- Excel的文件導(dǎo)入需要借用一下簡(jiǎn)單的客戶端工具(當(dāng)然靠命令都可以實(shí)現(xiàn)),選擇"導(dǎo)入"-> “選擇文件” -> “列的默認(rèn)處理(日期之類的)” -> “列的字段映射” -> "導(dǎo)入形式(append)"然后就開始了,這個(gè)過程沒有問題;
- 相對(duì)比較迅速地導(dǎo)入了幾十萬的數(shù)據(jù);
- 查看表,確認(rèn)字段映射和數(shù)據(jù)導(dǎo)入準(zhǔn)確;
問題3:對(duì)于沒有的字段如何補(bǔ)充?
- 這個(gè)問題主要面對(duì)的是,如何填補(bǔ)主鍵,在傳輸過來的數(shù)據(jù)中,只有業(yè)務(wù)數(shù)據(jù),那每一條數(shù)據(jù)對(duì)應(yīng)需要基于一個(gè)遞增或者UUID類型的主鍵,這個(gè)如何實(shí)現(xiàn)?
- 目前的需求,主鍵是UUID
- 方法一:使用create extension方式,下面詳述;
- 方法二:沒有默認(rèn)安裝,需要導(dǎo)入SQL,psql -U postgres -f 安裝路徑/share/contrib/uuid-ossp.sql :
- 以下是方法一的操作過程:
- create extension說明:
- 接下來需要對(duì)上述導(dǎo)入完成的數(shù)據(jù)添加主鍵;
- update xxx set id = uuid_generate_v4() where id is null;
- 首先使用默認(rèn)帶中橫線的UUID形式,再修改;
- update xxx set id = (SELECT REPLACE(ID,’-’,’’)) where id like ‘%-%’;
- 這幾個(gè)步驟也比較順利,能夠正確的初始化id的值;
問題4:(新增的需求)如何從現(xiàn)有數(shù)據(jù)中提煉出省市的信息?
- 提煉省和市,主要就是將省和市的字段進(jìn)行組合并輸出去重
- SELECT distinct(concat_ws(’,’,province,city)) FROM “xxx”;
- 導(dǎo)出到文件后,通過文件導(dǎo)入,建立樹形結(jié)構(gòu)的省市關(guān)系;
附錄
1.docker宿主機(jī)和容器如何傳輸文件?
1、從容器里面拷文件到宿主機(jī) docker cp 容器名:要拷貝的文件在容器里面的路徑 要拷貝到宿主機(jī)的相應(yīng)路徑 docker cp postgres:/opt/area.csv /xxx/xxx/xxx/xxx/2、從宿主機(jī)拷文件到容器里面 docker cp 要拷貝的文件路徑 容器名:要拷貝到容器里面對(duì)應(yīng)的路徑docker cp /opt/test.js tomcat:/xxx/xxx/xxx/xxxx/test/js2.如何將postgres查詢的結(jié)果輸出到文件?
方法一:使用輸出流的方式
- 步驟一:\o test.txt, 打開一個(gè)文件
- 步驟二:此時(shí)已經(jīng)建立輸出流,執(zhí)行SQL即可將結(jié)果輸出到文件,select * from a_txt;
- 步驟三:\o ,關(guān)閉文件輸出,如果不關(guān)閉,接下來的結(jié)果都會(huì)輸出到你指定的文件,但是通過"\o"關(guān)閉了,就繼續(xù)切換到屏幕輸出結(jié)果
方法二:使用拷貝的方式
- COPY (SELECT * FROM a_txt) TO ‘/tmp/query.csv’ (format csv, delimiter ‘,’)
3. 多字段合并輸出?
- 同一條數(shù)據(jù)中,將多個(gè)字段合并:concat_ws(’:’,a,b),a和b用冒號(hào)隔開
- 同一個(gè)查詢中,將多條結(jié)果合并:string_agg(c,’ \r\n '),每條數(shù)據(jù)c之間使用\r\n隔開
- 組合操作:string_agg(concat_ws(’:’,a,b),’ \r\n ’ order by a asc) as result ,結(jié)果就是: 0:a \r\n 1:b
4. 一些postgres常用命令
\l 列出數(shù)據(jù)庫\c test 切換數(shù)據(jù)庫\d 列出數(shù)據(jù)表\d a_test 查看數(shù)據(jù)表5.數(shù)據(jù)類型的映射
- 在使用mysql的時(shí)候習(xí)慣了用LocalDate和LocalDateTime來記錄時(shí)間,到了postgres并不可行;
- mysql中:
- postgres中:
6.部分參考列表
- UUID的使用
- postgres mysql的對(duì)比
- navicat 導(dǎo)入MySQL 創(chuàng)建主鍵uuid
如果有朋友,對(duì)于大數(shù)據(jù)量導(dǎo)入的場(chǎng)景有經(jīng)驗(yàn)的,歡迎留言交流,我一定好好學(xué)習(xí)~
總結(jié)
以上是生活随笔為你收集整理的postgres 导入纯文本数据txt的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 某计算机机房的上机控制电路,2012年南
- 下一篇: 十二周工作周报