无法在 psql GreenPlum 中分发

Posted

技术标签:

【中文标题】无法在 psql GreenPlum 中分发【英文标题】:Can't DISTRIBUTE BY in psql GreenPlum 【发布时间】:2015-10-14 08:10:24 【问题描述】:

我正在尝试在运行 GreenPlum (Postgres) 服务器的 RHEL5 机器上创建一个表。

我要创建的表需要有一个“DISTRIBUTE BY”子句,其中一些列作为其谓词。

如果没有“分发方式”,整个命令可以很好地创建表,但是当我添加它时,会出现以下语法错误:

错误:“已分发”处或附近的语法错误

我也查看了这篇帖子 (DISTRIBUTE BY notices in Greenplum),但找不到解决方案。

查询结构为:

创建表(列) DISTRIBUTED BY(列);

谢谢!

【问题讨论】:

您运行的确切版本是什么? @JosipIvicpostgres=# CREATE TABLE testdb (column1 int, column2 text) 分配者 (column1, column2);错误:“DISTRIBUTED”第 1 行或附近的语法错误:CREATE TABLE testdb (column1 int, column2 text) DISTRIBUTED ... @JakubKania 根据安装文件是:4.3.6.1-build-2 @JakubKania 更好: postgres=# select version();版本 - - - - - - - - - - - - - - - - - - - - - - - - - ------------------------------------------- -------- ----------- x86_64-redhat-linux-gnu 上的 PostgreSQL 9.2.13,由 gcc (GCC) 4.8.3 20140 911 (Red Hat 4.8.3-9) 编译,64 位 (1行) @Ronnie 看来您使用的是 PostgreSQL 而不是 Greenplum。 【参考方案1】:

这里您只是连接到 Postgres,而不是 Greenplum,这就是您收到此错误的原因。

运行psql 时,请确保您指定了正确的主机和要连接的正确端口,例如psql -h greenplum_master -p 5432

当您运行连接到 Greenplum 数据库的 select version(); 时,您会看到

[gpadmin@gpdb greenplum-db]$ psql
psql (8.2.15)
Type "help" for help.

test=# select version();
                                                                       version                                                                        
------------------------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 8.2.15 (Greenplum Database 4.3.6.1 build 2) on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.4.2 compiled on Oct  1 2015 15:14:22
(1 row)

这意味着您正在运行 Greenplum。如果您只看到 PostgreSQL,请确保 Greenplum 启动时在 GPDB 主控主机上运行 gpstate 并确保您连接到正确的主机和端口

【讨论】:

【参考方案2】:

当您指定分布式子句,并且您的表中有一个主键时,您的分布式键应该是主键的一部分,它应该是主键的一部分。

比如你的主键是column1、column2和column 3,那么你的分布式key应该是column1或者column1&column2或者和你的主键一样。

【讨论】:

这是不正确的。您不需要 PK 来指定分发密钥。您还应该避免使用 PK 索引,因为它会增加存储空间、减慢数据加载速度,并且查询优化器很少会使用该索引。 谢谢乔恩。我纠正我的答案。使用分布式键时不需要主键。 Jon,根据 3NF,每个表都应该有一个主键。 Robinson,如果您愿意,请继续创建 PK。 Greenplum 不需要在表上拥有一个,并且在表上使用散列分布不需要 PK。 你是对的。 PK 对于表定义不是强制性的,但在现实世界中,为了最佳实践,每个表都应该有一个主键。

以上是关于无法在 psql GreenPlum 中分发的主要内容,如果未能解决你的问题,请参考以下文章

用于动态查询的 Greenplum PSQL 格式

使用 psql 和 centos7 进行任何搜索或插入操作时,greenplum 永远挂起

无法从 Windows 上的 pgadmin 连接到 greenplum postgresql

GreenPlum数据库使用

无法在 Xcode 中分发我的 iOS 版 Flutter 应用程序 - “包中的 ipa 包含无效字符”

Greenplum匿名代码块错误?