使用Apache HAWQ时外部表和内部表之间的区别?

时间:2017-03-09 10:35:23

标签: hawq

我正在使用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数据库处理数据。

1 个答案:

答案 0 :(得分:2)

使用gpfdist的外部表

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

    [{
            "id": 1001,
            "name": "Gaurdian Store",
            "is_fave_shop": "0",
            "products": [{
                "id": 14285912,
                "name": "Sofra Cream",
                "is_wishlist": false
            }]
        },
        null,
        null,
        {
            "id": 1002,
            "name": "decolite",
            "is_fave_shop": "1",
            "products": [{
                "id": 14285912,
                "name": "Denca SPF",
                "is_wishlist": false
            }]
        }
    ]
    

内部表

  • 数据存储在HDFS中
  • 收集统计数据并将其存储在目录
  • 文件仅为HDFS文件
  • 您可以利用HDFS功能,如镶木地板格式和快速压缩
  • 为查询提供最佳效果

外部表只是可以更轻松地将数据加载到数据库中,并使其更快地完成。

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

  1. 将文件scp到边缘节点
  2. hdfs将文件放入hdfs
  3. 使用PXF在HAWQ中创建外部表以读取文件
  4. 将数据插入HAWQ表
  5. 这将起作用,PXF将并行读取HDFS中的文件。但是,第2步是单个过程和瓶颈。相反,这样做:

    1. 将文件scp到边缘节点
    2. 启动gpfdist进程
    3. 使用gpfdist在HAWQ中创建外部表以读取文件
    4. 将数据插入HAWQ表
    5. 现在"放"进入HDFS是并行完成的,因为HAWQ将在每个节点上启动虚拟段来放置数据。这通常是每个数据节点6个虚拟段,因此在10节点集群中,您将有60个进程将数据放入HDFS而不是单个节点。