File eksternal adalah data massal terbaik dan tipikal
Istilah "data massal" terkait dengan "banyak data", jadi wajar untuk menggunakan data mentah asli , tanpa perlu mengubahnya menjadi SQL. File data mentah yang umum untuk "sisipan massal" adalah format CSV dan JSON .
Sisipkan massal dengan beberapa transformasi
Dalam aplikasi ETL dan proses menelan, kita perlu mengubah data sebelum memasukkannya. Tabel sementara mengkonsumsi (banyak) ruang disk, dan itu bukan cara yang lebih cepat untuk melakukannya. The PostgreSQL asing-data yang wrapper (FDW) adalah pilihan terbaik.
Contoh CSV . Misalkan tablename (x, y, z)
pada SQL dan file CSV suka
fieldname1,fieldname2,fieldname3
etc,etc,etc
... million lines ...
Anda dapat menggunakan SQL klasik COPY
untuk memuat ( seperti data asli) ke dalam tmp_tablename
, mereka memasukkan data yang disaring ke tablename
... Tapi, untuk menghindari konsumsi disk, yang terbaik adalah dengan langsung dicerna oleh
INSERT INTO tablename (x, y, z)
SELECT f1(fieldname1), f2(fieldname2), f3(fieldname3) -- the transforms
FROM tmp_tablename_fdw
-- WHERE condictions
;
Anda perlu menyiapkan basis data untuk PLRT Asing, dan sebaliknya statis tmp_tablename_fdw
Anda bisa menggunakan fungsi yang menghasilkannya :
CREATE EXTENSION file_fdw;
CREATE SERVER import FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE tmp_tablename_fdw(
...
) SERVER import OPTIONS ( filename '/tmp/pg_io/file.csv', format 'csv');
Contoh JSON . Seperangkat dua file, myRawData1.json
dan Ranger_Policies2.json
dapat dicerna dengan:
INSERT INTO tablename (fname, metadata, content)
SELECT fname, meta, j -- do any data transformation here
FROM jsonb_read_files('myRawData%.json')
-- WHERE any_condiction_here
;
di mana fungsi jsonb_read_files () membaca semua file folder, ditentukan oleh mask:
CREATE or replace FUNCTION jsonb_read_files(
p_flike text, p_fpath text DEFAULT '/tmp/pg_io/'
) RETURNS TABLE (fid int, fname text, fmeta jsonb, j jsonb) AS $f$
WITH t AS (
SELECT (row_number() OVER ())::int id,
f as fname,
p_fpath ||'/'|| f as f
FROM pg_ls_dir(p_fpath) t(f)
WHERE f like p_flike
) SELECT id, fname,
to_jsonb( pg_stat_file(f) ) || jsonb_build_object('fpath',p_fpath),
pg_read_file(f)::jsonb
FROM t
$f$ LANGUAGE SQL IMMUTABLE;
Kurangnya streaming gzip
Metode yang paling sering untuk "konsumsi file" (terutama di Big Data) adalah mempertahankan file asli pada format gzip dan mentransfernya dengan algoritma streaming , apa pun yang dapat berjalan cepat dan tanpa konsumsi diska di pipa unix:
gunzip remote_or_local_file.csv.gz | convert_to_sql | psql
Jadi ideal (masa depan) adalah opsi server untuk format .csv.gz
.