您的表retail_demo.order_lineitems_hawq 必须使用散列进行分发。当您在 HAWQ 中执行此操作时,存储桶的数量由初始化数据库时设置的 default_hash_table_bucket_number 确定。每个存储桶在 HDFS 中都会有一个文件,这是因为将有固定数量的虚拟段或 vsegs,以及散列分布式表。
您可以通过两种方式指定存储桶的数量。一种是在创建表时执行此操作。
CREATE TABLE foo (id int) WITH (BUCKETNUM=4) DISTRIBUTED BY (id);
如果不指定 BUCKETNUM,则桶数由 default_hash_table_bucket_number 设置。
另一种方法是使用随机分布,让优化器计算出它需要使用多少个 vseg。这也是推荐的方法。您应该在 HAWQ 中使用随机分布。
CREATE TABLE foo (id int) DISTRIBUTED RANDOMLY;
对于随机分布的表,您可以通过调整 GUC hawq_rm_nvseg_perquery_perseg_limit 来指定数据库可以使用的 vseg 数量。对于具有 1 到 85 个节点的集群,默认值为 6,如果您有足够的资源,您可以增加此值以获得更好的性能。
以及数据的位置...
gpadmin=# CREATE TABLE foo (id int) DISTRIBUTED RANDOMLY;
CREATE TABLE
gpadmin=# insert into foo select i from generate_series(1,100) as i;
INSERT 0 100
现在获取数据库的oid。
gpadmin=# select oid from pg_database where datname = 'gpadmin';
oid
-------
16508
(1 row)
并得到表的 oid。
gpadmin=# select oid from pg_class where relname = 'foo';
oid
-------
16519
(1 row)
文件路径格式是一个字符串,如hdfs://hostname:port/hawqfilespacename/tablespace_oid/database_oid/table_oid/filenumber
. 初始化数据库时,会设置 HDFS 中的位置,通常设置为“/hawq_data”(文件空间)。在那个目录中,总是有一个名为“16385”的子目录,它是表空间oid。在这个目录中,有一个数据库目录,然后是表的目录。
hdfs dfs -ls /hawq_data/16385/16508/16519
Found 1 items
-rw------- 1 gpadmin hdfs 1016 2017-03-10 10:17 /hawq_data/16385/16508/16519/1
该单个文件是 foo 的数据。由于我使用的是随机分布的表,因此只有一个文件。
将其更改为散列分布式表,为我提供了更多文件。
gpadmin=# drop table foo;
DROP TABLE
gpadmin=# CREATE TABLE foo (id int) DISTRIBUTED BY (id);
CREATE TABLE
gpadmin=# insert into foo select i from generate_series(1,100) as i;
INSERT 0 100
gpadmin=# select oid from pg_class where relname = 'foo';
oid
-------
16524
(1 row)
我在 HDFS 中有两个文件,因为我的单节点集群已配置为默认存储桶编号为 2。
[gpadmin@hdb210 ~]$ hdfs dfs -ls /hawq_data/16385/16508/16524/
Found 2 items
-rw------- 1 gpadmin hdfs 520 2017-03-10 10:24 /hawq_data/16385/16508/16524/1
-rw------- 1 gpadmin hdfs 520 2017-03-10 10:24 /hawq_data/16385/16508/16524/2
[gpadmin@hdb210 ~]$ psql
psql (8.2.15)
Type "help" for help.
gpadmin=# show default_hash_table_bucket_number;
default_hash_table_bucket_number
----------------------------------
2
(1 row)