GreenPlum如何实现外部表?

时间:2016-12-13 11:19:49

标签: external greenplum

我正在学习gpdb。我对外部表感到困惑。以下是我的理解。

对于只读表,gpdb仅创建表的元数据。所有数据都存储在远程服务器上,如hdfs。查询时,数据从远程服务器传输到段。查询结束时,数据不会保存在段中。

对于只写表,gpdb将从远程加载数据。所有数据都将保存在细分中。插入操作将修改本地段上的数据,而不是远程数据。

我的理解是对的吗?

1 个答案:

答案 0 :(得分:2)

外部表是在数据库外部存储和管理数据的表。一个例子是CSV或TEXT文件。

可读外部表具有存储在数据库中的元数据,就像您所说的,所有数据都存储在HDFS等其他地方。它也可以是Greenplum的本地文件系统。最常见的外部表使用gpfdist来“提供”文件。 gpfdist基本上是一个Web服务器,多个段可以同时读取。

示例:

首先,我将在四个不同的主机上启动gpfdist。所有段主机也必须可以访问这些主机。

[gpadmin@host1] gpfdist -p 8999 -d /landing/ &
[gpadmin@host2] gpfdist -p 8999 -d /landing/ &
[gpadmin@host3] gpfdist -p 8999 -d /landing/ &
[gpadmin@host4] gpfdist -p 8999 -d /landing/ &

现在在每个文件中放置一个示例文件:

[gpadmin@host1] hostname > /landing/hostname.txt
[gpadmin@host2] hostname > /landing/hostname.txt
[gpadmin@host3] hostname > /landing/hostname.txt
[gpadmin@host4] hostname > /landing/hostname.txt

创建一个外部表来读取它:

[gpadmin@master] psql
gpadmin=# create external table public.ext_hostnames 
(hostname text) 
location (
'gpfdist://host1:8999/hostname.txt', 
'gpfdist://host2:8999/hostname.txt',
'gpfdist://host3:8999/hostname.txt',
'gpfdist://host4:8999/hostname.txt')
format 'text' (delimiter '|' null as ''); 

这个简单的示例显示了数据库外部管理的文件,现在可由Greenplum通过外部表访问。

可写外部表反转这一点,允许您将数据写入外部系统,如HDFS或posix文件系统。

[gpadmin@master] gpfdist -p 8999 -d /home/gpadmin/ &
[gpadmin@master] psql
gpadmin=# create writable external table public.wrt_example 
(foo text) 
location ('gpfdist://master:8999/foo.txt') 
format 'text' (delimiter '|' null as '');
insert into public.wrt_example values ('jon');

gpadmin=# insert into public.wrt_example select 'jon';
gpadmin=# \q

[gpadmin@master] cat /home/gpadmin/foot.txt
jon

可写外部表的用例是在Greenplum中获取数据并将其放在其他位置。

一个常见示例是当您将HDFS用于Data Lake和Greenplum for Analytics时。您可以使用外部表从HDFS读取数据并将其插入Greenplum表。然后,您可以分析此数据,使用Madlib包中的分析函数,并找到有关数据的新见解。现在,您希望将这些来自Greenplum的新数据推回到HDFS,以便其他消费者可以从这些见解中受益。然后使用可写外部表将数据从Greenplum INSERT到HDFS。

可读外部表的最常见用例是将外部源中的文件加载到Greenplum中。