日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

postgres 导入纯文本数据txt

發(fā)布時(shí)間:2024/1/8 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
1. 那這是一個(gè)坑,問題在于很多客戶端軟件的支持還沒有到位,或者說我安裝的版本支持并不好,2. 導(dǎo)致通過命令行建立的表在可視化中不可見,也就不能使用客戶端軟件類似于導(dǎo)入這一類的功能,因而失敗3. 而且一些錯(cuò)誤的提示百度而不得,對(duì)于小白加上需要解決問題的方面來說,理智的做法是更換版本,而不是追根究底一些原理或者去提一些issue求救之類的做法
  • 而后就放棄了嘗鮮,換了最廣泛使用的9.x版本,使用docker選了9.6版本,構(gòu)建了簡(jiǎn)單的Postgres數(shù)據(jù)庫,這也是比較成熟,支持的比較廣泛的版本(在這個(gè)版本上沒有發(fā)現(xiàn)客戶端和命令行的不同步不可見問題);
docker 安裝postgres 創(chuàng)建掛載卷: docker volume create pgdata下載鏡像: docker pull postgres:9.6運(yùn)行postgres: docker run -it --rm -v pgdata:/var/lib/postgresql/data -p 5432:5432 --name postgres -d postgres:9.6

問題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ò)大需自行配置:
springservlet:(請(qǐng)注意這個(gè)參數(shù),根據(jù)springboot版本的不同,可能在http,也可能在這個(gè)servlet下)multipart:max-file-size: 10MBmax-request-size: 10MB
  • 如果想繼續(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ù)量;
  • 以上方法最終也被拋棄:
從整體角度來說,1. HTTP下上傳下載文件都不應(yīng)該是超大文件(除非文件系統(tǒng)),不應(yīng)該隨意的放寬文件上傳下載的限制來占用大量?jī)?nèi)存讀寫;2. 并且Excel上傳下載組件對(duì)大數(shù)據(jù)量的操作支持的可能性極低(需要進(jìn)行百萬級(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 :
  • 以下是方法一的操作過程:
創(chuàng)建UUID擴(kuò)展插件: create extension "uuid-ossp";測(cè)試正常使用: select uuid_generate_v4();如果有輸出,那就沒有問題了
  • create extension說明:
CREATE EXTENSION將新擴(kuò)展加載到當(dāng)前數(shù)據(jù)庫中。 必須沒有已加載的同名擴(kuò)展。加載擴(kuò)展基本上等于運(yùn)行擴(kuò)展的腳本文件。 該腳本通常會(huì)創(chuàng)建新的SQL對(duì)象,例如函數(shù),數(shù)據(jù)類型,運(yùn)算符和索引支持方法。另外,CREATE EXTENSION記錄所有已創(chuàng)建對(duì)象的標(biāo)識(shí),以便在發(fā)出DROP EXTENSION時(shí)可以再次刪除它們。加載擴(kuò)展需要具有創(chuàng)建其組件對(duì)象所需的相同權(quán)限。 對(duì)于大多數(shù)擴(kuò)展,這意味著需要超級(jí)用戶或數(shù)據(jù)庫所有者權(quán)限。 運(yùn)行CREATE EXTENSION的用戶將成為擴(kuò)展的所有者,以便以后進(jìn)行權(quán)限檢查,以及擴(kuò)展程序腳本創(chuàng)建的任何對(duì)象的所有者。
  • 接下來需要對(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/js

2.如何將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中:
程序中:LocalDate mysql: date程序中:LocalDateTime mysql: datetime
  • postgres中:
程序中:Date postgres: date程序中:Date postgres: timestamp程序中:Date postgres: timestamptz(帶時(shí)區(qū))

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。