如何在使用JDBC创建Spark DataFrame时指定SQL方言?

4
我在使用Spark中的自定义JDBC读取数据时遇到了问题。我该如何覆盖通过jdbc url推断出来的SQL方言?
涉及的数据库是vitess(https://github.com/youtube/vitess),它运行的是mysql变种,因此我想指定mysql方言。 jdbc url以jdbc:vitess/开头。
否则,DataFrameReader将推断出默认的方言,它使用"""作为引号标识符。结果,通过spark.read.jdbc发送的查询语句如下所示:

Select 'id', 'col2', col3', 'etc' from table

这会选择字符串表示而不是列值,而实际上应该是这样的:

Select id, col2, col3, etc from table

2个回答

8
也许现在已经晚了,但是答案如下:
创建您自己的定制方言,就像我为ClickHouse数据库所做的一样(我的JDBC连接URL看起来像这样:jdbc:clickhouse://localhost:8123)。
 private object ClickHouseDialect extends JdbcDialect {
    //override here quoting logic as you wish
    override def quoteIdentifier(colName: String): String = colName

    override def canHandle(url: String): Boolean = url.startsWith("jdbc:clickhouse")
  }

并将其在代码中的某个位置注册,如下:

JdbcDialects.registerDialect(ClickHouseDialect)

0

你可以像这样做。

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .load()

更多信息请查看this

您也可以这样指定。

val connectionProperties = new Properties()
    connectionProperties.put("user", "username")
    connectionProperties.put("password", "password")
    val jdbcDF2 = spark.read
      .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)

有没有不使用jdbc url来指定SQL方言的最佳方法?问题在于我正在使用自定义jdbc,其url前缀为“jdbc:vitess”。该jdbc需要将url指定为“jdbc:vitess”,但我希望Spark将连接解释为MySQL方言。 - Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接