我正在致力于将项目从 Impala 迁移到 PostgreSQL。在 Impala 中,我有一个具有以下存储格式和文件位置的表:
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/ABCD/%s'
%s 从业务逻辑中获取
和
SELECT * FROM abc.xyz STORED AS PARQUET
我需要找到在 PostgreSQL 中定义表的等效方法:
分隔字段(例如,以逗号分隔)。 存储为纯文本(即类似 CSV 的格式)。 数据的特定文件位置。 我知道 PostgreSQL 处理外部存储的方式与 Impala 不同,因此我正在寻找处理此问题的最佳方法。 COPY 是从像这样的外部位置加载数据的正确方法吗?还是还有其他推荐的方法?
我尝试了很多方法,但找不到任何方法来找到等效的
那么我可以知道
的等效内容吗?STORED AS PARQUET
和
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/ABCD/%s'
最好的近似方法是使用 file_fdw 扩展名:
-- as superuser
CREATE EXTENSION file_fdw;
-- needed for bureaucratic reasons
CREATE SERVER local_files FOREIGN DATA WRAPPER file_fdw;
-- needed so that everyone can use the foreign table
CREATE USER MAPPING FOR PUBLIC SERVER local_files;
CREATE FOREIGN TABLE abc.xyz (
col1 integer,
col2 text,
col3 timestamp with time zone
) SERVER local_files
OPTIONS (filename '/abc/file.csv', format 'csv', encoding 'UTF8');
/abc/file.csv
可能看起来像这样:
1,some text,2024-10-18 09:00:00+00
2,something else,2024-10-18 10:00:00+00
您可以授予普通用户在外部服务器上的
USAGE
权限,然后您不需要超级用户来创建外部表。
没有“业务逻辑”来生成文件名,因此您需要为要以这种方式访问的每个 CSV 文件定义一个外部表。