如何在没有 Only 的情况下生成 spark sql 截断查询

Posted

技术标签:

【中文标题】如何在没有 Only 的情况下生成 spark sql 截断查询【英文标题】:How to generate a spark sql truncate query without Only 【发布时间】:2019-12-23 06:56:57 【问题描述】:

我正在使用 Spark(3.0.0_preview) 并从/向 GreenPlum(5.24 版)读取/写入。 Greenplum 5.24 版不支持“truncate table only $table_name”命令。

使用 Spark 3.0.0_preview 和 jdbcdriver(org.postgresql" % "postgresql" % "42.2.5),Spark 生成的命令是“truncate table only $table_name”。

 df.write.format("jdbc").option("url", "jdbc:postgresql://test:5432/sample")
.option("user", "sample")
.option("password", "sample")
.option("dbtable", "test.employer")
.option("truncate", true) // **Genearte truncate table only**
.mode(SaveMode.Overwrite)
.save();

我想生成不带 ONLY 选项的截断命令。由于 Greenplum V5.24 不支持唯一的选项

【问题讨论】:

Greenplum 不会截断“依赖”表。 RI 也没有在 Greenplum 中强制执行。因此,您不需要“仅”。 @Jon Roberts,我不需要它,但 Spark 正在使用 Only 选项创建截断查询。根据消息来源,Spark 的 PostgreSQL 方言只能生成 TRUNCATE ONLY ... 或 TRUNCATE ONLY ... CASCADE 【参考方案1】:

正如@mazaneicha 提到的,Spark 的 PostgreSQL 方言只能生成 TRUNCATE ONLY

为了让这对我有用,我正在使用 Scala 截断我的表格。这不是一个好的修复方法,但在我们升级到仅支持 TRUNCATE TABLE 的 GreenPlum 6 之前可以使用

 truncate(""test.employer", "jdbc:postgresql://test:5432/sample","sample","sample" )
 df.write.format("jdbc").option("url", "jdbc:postgresql://test:5432/sample")
 .option("user", "sample")
 .option("password", "sample")
 .option("dbtable", "test.employer")
 .mode(SaveMode.Append)
 .save();

 def truncate(tableName: String, jdbcUrl: String, username: String, password: 
 String) = 
 val connection = DriverManager.getConnection(jdbcUrl, username, password)
 connection.setAutoCommit(true)
 val statement = connection.createStatement()
 statement.execute(s"TRUNCATE TABLE $tableName")
 

【讨论】:

以上是关于如何在没有 Only 的情况下生成 spark sql 截断查询的主要内容,如果未能解决你的问题,请参考以下文章

apache spark可以在没有hadoop的情况下运行吗?

如何在没有 Spark-Shell 的情况下从 AWS 控制台运行 Spark jar 文件

如何在没有 SparkSQL 的情况下使用 fastxml 解析 Spark 中的 JSON?

如何在没有数据库连接的情况下从 dbplyr 生成 SQL?

如何在没有公共密钥的情况下合并 Apache Spark 中的两个数据帧?

是否可以在没有任何训练的情况下使用 Caffe Only 进行分类?