错误:[Pivotal][Greenplum JDBC Driver][Greenplum]prepared statement "PS1" 已经存在

Posted

技术标签:

【中文标题】错误:[Pivotal][Greenplum JDBC Driver][Greenplum]prepared statement "PS1" 已经存在【英文标题】:Error: [Pivotal][Greenplum JDBC Driver][Greenplum]prepared statement "PS1" already exists 【发布时间】:2020-03-26 00:34:03 【问题描述】:

我在 Azure 上有一个 Greenplum 集群,当使用简单的 JDBC 连接时,我可以从本地机器访问它的数据。现在我尝试在 Spark SQL 中使用相同的 JDBC 驱动程序,如下所示:

val url = s"jdbc:pivotal:greenplum://$server:$port;DatabaseName=$database"
Spark.sqlContext.read.format("jdbc")
  .options(Map(
    "url"->url, "user"-> user, "password"-> password,
    "dbschema" -> "public", "dbtable" -> table
  ))
  .load()

load()执行时,抛出如下错误

Exception in thread "main" java.sql.SQLSyntaxErrorException: [Pivotal][Greenplum JDBC Driver][Greenplum]prepared statement "PS1" already exists. 
    at com.pivotal.jdbc.greenplumbase.ddcd.b(Unknown Source)
    at com.pivotal.jdbc.greenplumbase.ddcd.a(Unknown Source)
    at com.pivotal.jdbc.greenplumbase.ddcc.b(Unknown Source)
    at com.pivotal.jdbc.greenplumbase.ddcc.a(Unknown Source)
    at com.pivotal.jdbc.greenplum.wp.ddj.m(Unknown Source)
    at com.pivotal.jdbc.greenplum.ddg.c(Unknown Source)
    at com.pivotal.jdbc.greenplum.ddg.d(Unknown Source)
    at com.pivotal.jdbc.greenplum.ddg.a(Unknown Source)
    at com.pivotal.jdbc.greenplumbase.dddr.y(Unknown Source)
    at com.pivotal.jdbc.greenplumbase.dddr.x(Unknown Source)
    at com.pivotal.jdbc.greenplumbase.dddl.executeQuery(Unknown Source)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:61)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation$.getSchema(JDBCRelation.scala:210)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:35)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:318)
    at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:167)
    at dzlab.GreenplumSparkSample$.read1(GreenplumPropertyFactory.scala:21)
    at dzlab.GreenplumSparkSample$.main(GreenplumPropertyFactory.scala:35)
    at dzlab.GreenplumSparkSample.main(GreenplumPropertyFactory.scala)

如果我使用简单的 JDBC 连接并以 java 方式读/写数据,一切正常。所以不确定这里有什么问题?

【问题讨论】:

【参考方案1】:

Greenplum 在云端的部署使用 pgBouncer 和事务的 pool_mode。 pgBouncer 在这种模式下不支持准备好的语句。

有一些解决方法。一个是recommended way, “对 JDBC 执行此操作的正确方法是添加 prepareThreshold=0 参数来连接字符串。”

另一种解决方法是直接连接到 Greenplum 并绕过 pgBouncer。数据库监听 6432 端口,而 pgBouncer 监听 5432。

【讨论】:

非常感谢您的回复,这肯定会为我节省大量时间。将尝试推荐的选项。

以上是关于错误:[Pivotal][Greenplum JDBC Driver][Greenplum]prepared statement "PS1" 已经存在的主要内容,如果未能解决你的问题,请参考以下文章

Pivotal Greenplum - 增量数据问题

Pivotal HDB - 如何将数据从 HAWQ 内部/外部可读表推送到 Greenplum

如何安装greenplum

greenplum 下载地址

Greenplum-cc-web安装

无法使用 Spark 连接器从 GreenPlum 读取