PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

C'è un modo per caricare i dati di testo nel database in PostgreSQL?

Un approccio che utilizzo con i miei file XML di grandi dimensioni (130 GB o più) consiste nel caricare l'intero file in un non registrato temporaneo tabella e da lì estraggo il contenuto che voglio. Unlogged tables non sono a prova di crash, ma sono molto più veloci di quelli registrati, il che si adatta perfettamente allo scopo di una tabella temporanea;-)

Considerando la tabella seguente..

CREATE UNLOGGED TABLE tmp (raw TEXT);

.. puoi importare questo file da 1 GB utilizzando un singolo psql riga dalla tua console (unix)..

$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN" 

Dopodiché, tutto ciò di cui hai bisogno è applicare la tua logica per interrogare ed estrarre le informazioni desiderate. A seconda delle dimensioni della tua tabella, puoi creare una seconda tabella da un SELECT , ad esempio:

CREATE TABLE t AS
SELECT 
  trim((string_to_array(raw,','))[1]) AS operation,
  trim((string_to_array(raw,','))[2])::timestamp AS tmst,
  trim((string_to_array(raw,','))[3]) AS txt
FROM tmp
WHERE raw LIKE '%DEBUG%' AND
      raw LIKE '%ghtorrent-40%' AND 
      raw LIKE '%Repo EFForg/https-everywhere exists%'

Regola il string_to_array funzione e il WHERE clausola alla tua logica! Facoltativamente puoi sostituire questi LIKE multipli operazioni su un singolo SIMILAR TO .

.. e i tuoi dati sarebbero pronti per essere giocati con:

SELECT * FROM t;

 operation |        tmst         |                               txt                                
-----------+---------------------+------------------------------------------------------------------
 DEBUG    | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)

Una volta estratti i tuoi dati puoi DROP TABLE tmp; per liberare spazio su disco;)

Ulteriori letture:COPY , PostgreSQL array functions e pattern matching