GreenPlum 如何将数据拆分为不同的段?

Posted

技术标签:

【中文标题】GreenPlum 如何将数据拆分为不同的段?【英文标题】:How does GreenPlum split data into different segments? 【发布时间】:2019-11-06 10:34:28 【问题描述】:

我想问一下GreenPlum是用什么规则把它的表分成段的。

它是将数据均匀地分成段还是根据块大小?

或者取决于数据的其他特征。

谢谢!

【问题讨论】:

【参考方案1】:

两种不同的方式。

    分发密钥

例子:

CREATE TABLE foo
(id int, bar text)
DISTRIBUTED BY (id);

这会将数据传播到 id 列。您应该选择将数据均匀分布在数据库中的一列或一组列。如果表非常大,并且您将它连接到另一个也非常大的表,您可能希望通过相同的键分布这两个表。

    随机

例子:

CREATE TABLE foo
(id int, bar text)
DISTRIBUTED RANDOMLY;

这以随机方式分布数据。将此用于小表或表没有自然键的情况。

您还可以使用隐藏列“gp_segment_id”查看分布情况。

select gp_segment_id, count(*) from foo group by gp_segment_id order by gp_segment_id;
 gp_segment_id | count 
---------------+-------
             0 |  1654
             1 |  1655
             2 |  1665
             3 |  1661
             4 |  1682
             5 |  1683

【讨论】:

你好,如果我是key分配,系统有5个段,这个怎么分配?均匀到 5 段?或将其打包成类似大小的块?如果在分发后增加了新的段,如果每个段有不同级别的存储空间怎么办?? 思考行。 ID=1 进入分段 1,ID=2 进入分段 2,依此类推。如果添加分段,则必须重新分配数据。 添加新段时,开头为空。您重新分配所有表,分配键获取新的段数并在所有段中重新分配数据。 distributed randomly 实际上并不是随机的,而是循环分配的误称,doc 说【参考方案2】:

如果您的分布键中有足够多的不同值,则您的数据是均匀分布的。主键或唯一键是很好的候选者。

如果您的分配键只有几个不同的值,则具有相同值的每一行最终都位于同一段中。这是一种分配不均的情况,一些部分必须完成所有工作,而另一些部分则处于空闲状态。

示例:如果您选择性别作为分布键,您(通常)会得到 2-3 个值:女性/男性/未知。让我们把其他可能的值放在一边。 在这种情况下,您有 2-3 个不同的值,并且 2-3 个不同的段数据库将保存所有行。最坏的情况:这 3 个段数据库都在同一个物理主机上。

【讨论】:

以上是关于GreenPlum 如何将数据拆分为不同的段?的主要内容,如果未能解决你的问题,请参考以下文章

分发键如何为GreenPlum分段分配数据

如何设计greenplum数据库结构

将文件/URI并行加载到greenplum中的外部表

GreenPlum 与hadoop啥关系

如何将包含多个键值对的列拆分为pyspark中的不同列

如何将oracle数据迁移到greenplum数据库