Postgres使用控制卡批量加载

时间:2016-12-20 13:15:30

标签: postgresql bulk-load

我们有一个案例,我们将数据从平面文件加载到postgres表。它是一个分隔文件。

文件内容:

A|B|C
1.1|2016-12-20|3

我只想加载COLUMN A,B& C,但表有10列。

在Oracle中,使用SQL loader,我们可以使用控制文件来使用所需的字段,我们可以根据需要进行操作。

OPTIONS (DIRECT=TRUE, PARALLEL=FALSE)
LOAD DATA
INFILE FILENAME
APPEND
INTO TABLE TABLENAME
FIELDS TERMINATED BY '\t'
TRAILING NULLCOLS
(
A DECIMAL EXTERNAL,
B "to_date(:B,'YYYY-MM-DD')",
C "case when REGEXP_LIKE(:C,'^[0-9.,]') then :C else '0' end",
)

使用COPY命令加载COLUMNS A,B& C.但是这里的技巧部分是,我们不能像在SQL加载器中那样在COPY命令中的源文件中使用任何操作。所以我们不能使用COPY命令。我离开了那个选项。

其他选项:

PG BULKLOAD实用程序比COPY快得多。我们可以使用CONTROL文件。但选项有限,如下所示;

#
# sample_csv.ctl -- Control file to load CSV input data
#
OUTPUT = table_name                   # [<schema_name>.]table_name
INPUT = /path/to/input_data_file.csv  # Input data location (absolute path)
TYPE = CSV                            # Input file type
QUOTE = "\""                          # Quoting character
ESCAPE = \                            # Escape character for Quoting
DELIMITER = ","                       # Delimiter

但我找不到

的任何选项
  • 指定需要加载的字段
  • 像Oracle控制文件一样进行操作

是否有任何方法可以使用PG BULK LOAD完成上述场景并提供一些参考。找不到任何其他来源。我假设,PGBULKLOAD是快速加载数据的最佳方式。如果我错了,请纠正我。

还有其他选择吗?在不影响性能的情况下。给我一些关于它的想法。

2 个答案:

答案 0 :(得分:0)

检查pgloader - 它也可以从类似csv的文件加载数据,它也可以进行转换&#34;飞行&#34;。以下是说明和示例 - http://pgloader.io/howto/csv.html

答案 1 :(得分:0)

我正在使用来自使用 postgreSQL COPY 的 psycopg2 的 copy_from 实用程序。您可以将输入数据作为 STDIN(类似文件的对象)提供。这工作得非常快,可以与 Oracle 中的 SQLLDR 相媲美(我没有针对 SQL Loader 中的直接路径加载选项对其进行测试)。否则,它工作得很好。 https://www.psycopg.org/docs/cursor.html#cursor.copy_from

我使用以下语法:

cur.copy_from(dataIterator,schemaTable,sep=chr(31),null='',columns=objColList)

哪里,

  • dataIterator 是 io.TextIOBase 的子类
  • schemaTable 是加载数据的目标表
  • sep 是列分隔符
  • objColList 是目标表中需要加载的列列表