【发布时间】:2018-12-18 14:07:05
【问题描述】:
我正在尝试使用 spark 读取 greenplum 数据库中的表,如下所示:
val execQuery = s"select ${allColumns}, 0 as ${flagCol} from schema.table where period_year=2017 and period_num=12"
val yearDF = spark.read.format("io.pivotal.greenplum.spark.GreenplumRelationProvider").option("url", connectionUrl).option("dbtable", s"(${execQuery}) as year2016")
.option("user", devUserName)
.option("password", devPassword)
.option("partitionColumn","header_id")
.option("lowerBound", 16550)
.option("upperBound", 1152921481695656862L)
.option("numPartitions",450).load()
当我使用 spark-submit 运行代码时,我得到一个异常:
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: relation "public.(select je_header_id,source_system_name,je_line_num,last_update" does not exist
Position: 15
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2310)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2023)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:217)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:421)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:318)
at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:281)
at com.zaxxer.hikari.pool.ProxyStatement.executeQuery(ProxyStatement.java:111)
at com.zaxxer.hikari.pool.HikariProxyStatement.executeQuery(HikariProxyStatement.java)
at io.pivotal.greenplum.spark.jdbc.Jdbc$.resolveTable(Jdbc.scala:301)
at io.pivotal.greenplum.spark.GreenplumRelationProvider.createRelation(GreenplumRelationProvider.scala:29)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:309)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
at com.partition.source.YearPartition$.prepareFinalDF$1(YearPartition.scala:141)
at com.partition.source.YearPartition$.main(YearPartition.scala:164)
at com.partition.source.YearPartition.main(YearPartition.scala)
在execQuery 中,我可以看到模式名和表名正确形成。当我提交代码时,它显示public.(select je_header_id,source_system_name,) relation not found。我不明白为什么将public 作为架构名称和查询(select je_header_id,source_system_name,je_line_num,last_update"
作为表名。
谁能告诉我我在这里犯了什么错误以及如何解决它?
【问题讨论】:
-
看起来您没有使用标准的 Spark JDBC 源,而是使用自定义连接器。在 Pivotal 论坛中,您可能会比在带有通用
spark标记和通用问题标题的 SO 中获得更多关注——您的问题似乎非常具体...... -
但是格式是一样的。我参考了这个链接:spark.apache.org/docs/latest/sql-data-sources-jdbc.html,这是所有类型数据库的标准。
-
我遇到了与
postgresql类似的问题,即使还在spark3.0中