0

我正在使用 HAWQ 处理基于列的文件。在阅读 Pivotal 文档时,他们建议用户应该使用gpfdist来读写可读的外部表,以便以并行方式快速处理数据。

我按照文档中的建议制作了一个表格,并通过 SQL 确认了我的数据,如下所示。

CREATE EXTERNAL TABLE ext_data
(col1 text, col2 text,col3 text, col4 text, col5 int, col6 int, col7 int,col8 int)
LOCATION ('gpfdist://hawq2:8085/*.csv')
FORMAT 'CSV'(DELIMITER ',');

SELECT gp_segment_id,count(*) from ext_data GROUP BY gp_segment_id;

数据均匀分布在所有从节点上。

以前我的目标是创建表,从文件中读取数据并确定加载的数据分布良好。它是通过使用 gpfdist 的上述过程实现的。

但问题是外部表和内部表之间的区别。即使两种方法具有相同的功能,使用外部或内部表的原因是什么。

我发现一些用户在使用 HAWQ 或 Greenplume 数据库时遵循以下程序的一些博客。

1. making external table using gpfdist
2. making internal table again
3. reading the data from external data into internal data.

我没有完全理解这种行为。最重要的是,我不知道为什么存在外部和内部表,并且应该使用 Apache Hawq 或 greenplume 数据库来处理数据。

4

1 回答 1

2

使用 gpfdist 的外部表

  • 数据位于 posix 文件系统中,而不是 HDFS
  • 没有统计数据
  • 文件可能位于不属于集群的 ETL 节点上
  • 您也可以在许多服务器上拥有多个文件
  • 将数据并行加载到内部表的理想解决方案

    insert into table_name select * from external_table_name;
    

内部表

  • 数据存储在 HDFS 中
  • 统计数据被收集并存储在目录中
  • 文件只是 HDFS 文件
  • 您可以利用 HDFS 功能,例如 parquet 格式和 snappy 压缩
  • 为查询提供最佳性能

外部表只是使将数据加载到数据库中变得更容易,并使其加载速度更快。

想想这个场景。您从会计系统中获得需要加载的文件。你可以这样做:

  1. scp 文件到边缘节点
  2. hdfs 将文件放入 hdfs
  3. HAWQ中创建外部表使用PXF读取文件
  4. 将数据插入HAWQ表

这将起作用,PXF 将并行读取 HDFS 中的文件。然而,第 2 步是一个单一的过程并且是一个瓶颈。相反,请执行以下操作:

  1. scp 文件到边缘节点
  2. 启动 gpfdist 进程
  3. 在 HAWQ 中创建一个外部表,使用 gpfdist 读取文件
  4. 将数据插入HAWQ表

现在“放入”到 HDFS 是并行完成的,因为 HAWQ 将在每个节点上启动虚拟段来放入数据。这通常是每个数据节点 6 个虚拟段,因此在 10 节点集群中,您将有 60 个进程将数据放入 HDFS,而不是单个进程。

于 2017-03-09T16:03:56.050 回答