【问题标题】:Is possible to use STDIN with CREATE FOREIGN TABLE?是否可以将 STDIN 与 CREATE FOREIGN TABLE 一起使用?
【发布时间】:2019-01-18 22:05:20
【问题描述】:

我一直在寻找 STDIN 选项,以与 COPY 类似的方式使用 FOREIGN TABLE...并在指南中发现一个“错误”:official sql-create-foreign-table Guide 没有关于选项的文档。没有链接,什么都没有:

选项(选项'值' [, ...])

与新外部表或其列之一关联的选项。 ...

因此,由于缺乏信息,这个问题一分为二:

  1. 可以将 STDIN 与 FOREIGN TABLE 一起使用吗?

  2. “OPTIONS”文档在哪里?


编辑以添加示例

CREATE FOREIGN TABLE t1 (
   aa text,
   bb bigint
) SERVER files OPTIONS (
   filename '/tmp/bigBigdata.csv',
   format 'csv',
   header 'true'
;

是一个经典的 PostgreSQL 对使用文件系统的限制,所以我需要一个终端解决方案......想象一下在 shell 上有管道的东西,就像

psql  -c "ALTER FOREIGN TABLE t1 ...  STDIN; CREATE TABLE t2 AS SELECT trim(aa) as aa, bb+1 as bb FROM t WHERE bb>999" < /thePath/bigBigdata.csv 

是一种“不直接复制,只过滤一个数据流”,并从这个过滤后的流中创建一个final table t2。

【问题讨论】:

    标签: postgresql foreign-data-wrapper


    【解决方案1】:

    我认为您对外部表感到困惑,我会尽力解释。

    1. 外部表的数据不驻留在 PostgreSQL 中,而是驻留在外部数据源(文件、不同的数据库等)中。

      外部表只是从 PostgreSQL 访问这些数据的一种方式,就像它们是 PostgreSQL 表一样。

      如果外部数据包装器支持,您可以 COPY 到外部表 FROM STDIN,但这与 CREATE FOREIGN TABLE 无关。 CREATE FOREIGN TABLE 定义了 PostgreSQL 应该如何定位外部数据以及数据的格式是什么。

    2. CREATE FOREIGN TABLE 中没有关于选项的文档,因为它们取决于您使用的外部数据包装器。

      查看国外数据包装器的文档。

    您的示例清楚地表明,您需要的不是外部表,而是一个临时表,您可以在其中COPY 稍后要修改的原始数据。您不能将file_fdw 用于驻留在客户端计算机上的数据。

    【讨论】:

    • 嗨 Laurenz,抱歉,我正在寻找 CSV bigbig 文件中的文件权限解决方案,我编辑以说明...关于“指南的错误”,缺少 *_fdw 模块引用(没有链接)是一个错误。多亏了这些线索,现在我可以看到file_fdw module 上没有STDIN。我的解决方法是使用“外语”(如PL/Python 与文件系统交互而没有丑陋的权限障碍)而不是 foreigin table 方法。
    • 大部分外来数据包装器不是 PostgreSQL 项目的一部分,因此它们在文档中没有位置。查看 PostgreSQL Wiki 以获取完整列表。您的用例仍未得到很好的描述;也许COPY ... FROM PROGRAM是你需要的。
    • 嗨@LaurenzAlbe,我正在浏览,2 年后,你看到了一个更好的例子:ingestion from relative path... 在 ETL/大数据术语中,“摄取”描述了一类要解决的问题. PostgreSQL 的梦想是摄取任何固定结构的 CSV 文件(my_foreign_stdin 或它的投影)......在梦想中,终端命令将是 psql _etc_ -c "INSERT INTO mytable SELECT column1::bigint, trim(column2) FROM my_foreign_stdin WHERE column1&gt;10" &lt; ./relative_path/file.csv
    • INSERT 替换为COPY,您就快到了。 v12 为COPY 提供了一个WHERE 子句。您只需要一些预处理步骤(sed?)或后处理(未记录的表,UPDATEALTER TABLE ... SET LOGGED)。
    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 2020-02-03
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    • 2019-03-18
    相关资源
    最近更新 更多