PG import 外部表 IMPORT FOREIGN SCHEMA
IMPORT FOREIGN SCHEMA语句用于批量创建外部表。本文为您介绍IMPORT FOREIGN SCHEMA语句的用法和使用限制。功能详情IMPORT FOREIGN SCHEMA 是 Hologres 提供的批量创建外部表的功能可将远程数据源中的表结构自动映射为 Hologres 外部表无需逐一手动建表。目前该功能支持以下两类数据源MaxCompute 表支持从 MaxCompute 两层模型或三层模型中批量导入外部表。DLF 中 Paimon 表支持从阿里云 DLF 中的 Paimon 表批量创建 Hologres 外部表。使用限制使用IMPORT FOREIGN SCHEMA语句时建议您添加LIMIT TO限制并使用括号将需要添加限制的表名称括起来。如果不添加该限制系统则将目标MaxCompute工作空间中的所有表批量创建至Hologres中。仅Hologres V1.1.26及以上版本支持对使用IMPORT FOREIGN SCHEMA创建的外部表名称增加前缀和后缀如果您的实例是V1.1.26以下版本请您使用常见升级准备失败报错或加入Hologres钉钉交流群反馈详情请参见如何获取更多的在线支持。仅Hologres V1.3及以上版本支持MaxCompute的三层模型模式即在原先的Project和Table之间增加了一层Schema的概念更多描述请参见Schema操作。如果您想在Hologres中使用MaxCompute的三层模型的项目创建外部表且您的Hologres版本较低请您使用常见升级准备失败报错或加入Hologres钉钉交流群反馈详情请参见如何获取更多的在线支持。命令格式在Hologres中批量创建外部表的命令格式如下。IMPORT FOREIGN SCHEMA remote_schema [ { LIMIT TO | EXCEPT } ( table_name [, ...] ) ] FROM SERVER odps_server INTO local_schema [ OPTIONS ( option value [, ... ] ) ]参数说明参数说明如下表所示。参数描述remote_schemaMaxCompute两层模型需要导入的MaxCompute表所在的项目名称。三层模型需要导入的MaxCompute的项目名称和Schema名称格式为odps_project_name#odps_schema_name。如果您MaxCompute的Project是三层模型模式您仍使用两层模型的写法调用则会报错报错样例如下。failed to import foreign schema:Table not found - table_xxxDLF对应DLF中创建的元数据库名称。table_nameMaxCompute需要导入的MaxCompute表的名称。DLF需要导入的DLF表名称。server_nameMaxCompute表所在的外部服务器名称默认为odps_server。您可以直接调用Hologres底层已创建的名为odps_server的外部表服务器详细原理请参见Postgres FDW。DLFDLF表所在的外部服务器名称详细操作请参见基于DLF Catalog访问Paimon数据。local_schemaHologres外部表所在的Schema名如public。optionsHologres支持如下四个optionif_table_exist表示导入时已经存在该表。取值如下error默认值表示已有同名外部表不再重复创建。ignore忽略该同名表跳过该表的导入使导入的表不重复。update更新并重新导入该表。if_unsupported_type表示导入的外部表中存在Hologres不支持的数据类型。取值如下error报错导入失败 并提示哪些表存在不支持的类型。skip默认值表示跳过导入的存在不支持类型的表并提示哪些表被跳过。prefix表示导入时生成的Hologres外部表的前缀自Hologres V1.1.26版本新增。suffix表示导入时生成的Hologres外部表的后缀自Hologres V1.1.26版本新增。说明Hologres仅支持创建MaxCompute外部表。新建的外部表名称需要同MaxCompute表的名称一致。使用示例MaxCompute两层模型。示例选取MaxCompute公共数据集public_data中的表在Hologres中批量创建外部表。您可以参照使用公开数据集描述登录并查询数据集 。示例1为public Schema新建一张外部表若表存在则更新表。IMPORT FOREIGN SCHEMA public_data LIMIT TO (customer) FROM server odps_server INTO PUBLIC options(if_table_exist update);示例2为public Schema批量新建外部表。IMPORT FOREIGN SCHEMA public_data LIMIT TO( customer, customer_address, customer_demographics, inventory,item, date_dim, warehouse) FROM server odps_server INTO PUBLIC options(if_table_exist update);示例3新建一个testdemo Schema并批量新建外部表。CREATE schema testdemo; IMPORT FOREIGN SCHEMA public_data LIMIT TO( customer, customer_address, customer_demographics, inventory,item, date_dim, warehouse) FROM server odps_server INTO testdemo options(if_table_exist update); SET search_path TO testdemo;示例4在public Schema批量创建外部表已有外表则报错。IMPORT FOREIGN SCHEMA public_data LIMIT to (customer, customer_address) FROM server odps_server INTO PUBLIC options(if_table_exist error);示例5在public Schema中批量创建外部表已有外表则跳过该外部表。IMPORT FOREIGN SCHEMA public_data LIMIT to (customer, customer_address) FROM server odps_server INTO PUBLIC options(if_table_exist ignore);MaxCompute三层模型。基于MaxComputeodps_hologres项目的tpch_10g这个Schema中的odps_region_10g表创建Hologres中的外部表。IMPORT FOREIGN SCHEMA odps_hologres#tpch_10g LIMIT to ( odps_region_10g ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist error,if_unsupported_type error);DLF数据源。DLF 数据源通过指定数据源名称如github_events直接创建Hologres外部表。示例为public Schema新建一张外部表若表存在则更新表。详细操作请参见基于DLF Catalog访问Paimon数据。IMPORT FOREIGN SCHEMA github_events limit to (customer) FROM SERVER paimon_server into public options (if_table_exist update);IMPORT FOREIGN SCHEMA 功能IMPORT FOREIGN SCHEMA是 PostgreSQL 针对外部数据包装器FDW提供的一个极其高效的批量导入功能。在没有它之前如果远程数据库有 100 张表你必须手动写 100 次CREATE FOREIGN TABLE语句把每个字段的名称、类型挨个敲一遍。而IMPORT FOREIGN SCHEMA可以一键自动读取远程数据库的元数据并在本地批量创建出对应的外部表。️ 核心语法与常用场景它的基本语法结构如下sqlIMPORT FOREIGN SCHEMA 远程模式名 [ LIMIT TO (表1, 表2...) | EXCEPT (表3, 表4...) ] FROM SERVER 外部服务器名称 INTO 本地模式名;请谨慎使用此类代码。以下是开发和运维中最常用的3 种玩法玩法 1全库/全模式一键导入最省事把远程数据库public模式下的所有表全部在本地的public模式下生成对应的外部表sqlIMPORT FOREIGN SCHEMA public FROM SERVER dblink_mdm_staging_dev INTO public;请谨慎使用此类代码。玩法 2白名单导入只导入指定的几张表远程有几百张表但我只需要其中两张比如uam_user和cmn_schemesqlIMPORT FOREIGN SCHEMA public LIMIT TO (uam_user, cmn_scheme) FROM SERVER dblink_mdm_staging_dev INTO public;请谨慎使用此类代码。玩法 3黑名单导入排除某些敏感表或大表导入远程public下的所有表但是排除包含敏感信息的钱包表或日志大表sqlIMPORT FOREIGN SCHEMA public EXCEPT (user_wallet, system_logs) FROM SERVER dblink_mdm_staging_dev INTO public;请谨慎使用此类代码。 关键机制与注意事项避坑指南它不是真的导数据只是导“结构”这个命令执行非常快通常不到 1 秒因为它并没有从远程复制任何一行数据到本地它只是在本地批量执行了CREATE FOREIGN TABLE建立了一个快捷方式映射。字段类型自动对齐你不需要关心远程表的字段是varchar、int8还是timestampPostgreSQL 会自动读取远程的表结构并在本地创建出完全匹配的字段类型。远程表结构变了怎么办如果远程数据库后来新增或删除了字段本地的外部表不会同步更新。此时你需要先在本地DROP FOREIGN TABLE然后重新执行一次IMPORT FOREIGN SCHEMA刷新结构。你目前是想把远程的某几张表捞到本地来用还是打算把整个远程数据库的表一并同步过来如果需要我可以帮你写出一个带独立 Schema 隔离比如导入到remote_mdm模式中避免污染本地public的完整脚本。