定义外部表

定义外部表

E外部表允许把外部文件当作常规数据库表来访问。它们常常被用来把数据移进或者移出Greenplum数据库。

要创建一个外部表定义,用户需要指定输入文件的格式以及外部数据源的位置。有关输入文件格式的信息, 请参考 格式化数据文件

使用下列协议之一来访问外部表数据源。用户不能在CREATE EXTERNAL TABLE语句中混用协议:
  • file:// 访问Segment主机上Greenplum数据超级用户 (gpadmin)能访问的外部数据文件。 见 file://协议
  • gpfdist:// 指向一个位于文件主机上的目录并且向Greenplum数据库所有的Segment并行提供外部数据文件。见 gpfdist://协议
  • gpfdists://gpfdist的一个安全版本。见 gpfdists:// 协议
  • s3://访问Amazon S3桶中的文件。见s3:// 协议
  • The pxf://协议使用Greenplum平台扩展框架(PXF)访问外部HDFS文件和HBase和Hive表。见pxf:// 协议
Note:

s3://pxf:// 协议是自定义数据访问协议,file://, gpfdist://, 和 gpfdists://协议是实现在Greenplum数据库内部的。自定义和内部协议有以下不同:

  • 自定义协议必须使用CREATE PROTOCOL 命令注册。 在数据库中注册PXF扩展会创建 pxf:// 协议。(见 使用PXF访问外部数据。)您可以选择性地注册 s3:// 协议。(见 配置和使用S3外部表。) 内部协议始终存在且无法取消注册。
  • 注册自定义协议时,会在pg_extprotocol catalog表中添加一行,以指定实现该协议的处理函数。 协议的共享库必须安装在所有Greenplum数据库主机上。 内部协议在pg_extprotocol表中没有记录,并且没有其他库需要安装。
  • 要授予用户对自定义协议的权限,请使用GRANT [SELECT | INSERT | ALL] ON PROTOCOL。要允许(或拒绝)内部协议的用户权限,需要使用CREATE ROLEALTER ROLECREATEEXTTABLE(或NOCREATEEXTTABLE)属性添加到每个用户的角色。

外部表从数据库内访问外部文件,就好像它们是常规的数据库表一样。用 gpfdist/gpfdists, pxf, 和 s3协议定义的外部表通过使用所有Greenplum数据库的Segment资源装载或卸载数据来利用Greenplum的并行机制。 pxf协议利用Hadoop分布式文件系统的并行体系结构来访问该系统上的文件。 s3协议利用了Amazon Web服务(AWS)的功能。

用户可以使用SELECTJOINSORT EXTERNAL TABLE DATA等SQL命令直接并行地查询外部表数据, 并且用户可以为外部表创建视图。

使用外部表的步骤是:

  1. 定义外部表。

    使用s3 协议, 用户还必须配置Greenplum数据库并且启用该协议。见 s3:// 协议

  2. 做下面的事情之一:
    • 在使用gpfdist或者gpdists协议时,启动Greenplum数据库文件服务器。
    • 验证为s3协议做好了所需的一次性配置。
  3. 把数据文件放置在正确位置。
  4. 用SQL命令查询外部表。

Greenplum数据库提供可读和可写的外部表:

  • 用于数据加载的可读外部表。 可读外部表支持:
    • 数据仓库中常见的基本提取,转换和加载(ETL)任务。
    • 从多个Greenplum数据库段实例并行读取外部表数据,以优化大型加载操作。
    • 过滤下推。 如果查询包含WHERE子句,则可以将其传递给外部数据源。 有关更多信息,请参考gp_external_enable_filter_pushdown服务器配置参数讨论。 请注意,此功能目前仅支持pxf协议(参阅 pxf:// 协议)。

    可读外部表仅允许SELECT操作。

  • 用于数据卸载的可写外部表。 可写外部表支持:
    • 从数据库表中选择数据以插入可写外部表。
    • 将数据以数据流形式发送到应用程序。 例如,从Greenplum数据库卸载数据并将其发送到连接到另一个数据库或ETL工具的应用程序以在其他地方加载数据。
    • 从Greenplum并行MapReduce计算接收输出。

    可写外部表仅允许INSERT操作。

外部表可以是基于文件的或者是基于Web的。使用file://协议的外部表示只读表。

  • 普通(基于文件的)外部表访问静态平面文件。普通外部表是可以重新扫描的:在查询运行时数据是静态的。
  • Web(基于Web的)外部表访问动态数据源, 或者在一个用http://协议的Web服务器上,或者通过执行OS命令或脚本得到。外部Web表不是可以重新扫描的:在查询运行时数据可以改变。

转储和操作只针对外部表和外部Web表的定义而非数据源。