3

我在使用 Spark 通过自定义 JDBC 读取数据时遇到问题。我将如何覆盖通过 jdbc url 推断的 sql 方言?

有问题的数据库是运行 mysql 变体的 vitess ( https://github.com/youtube/vitess ),所以我想指定一个 mysql 方言。jdbc url 以 jdbc:vitess/ 开头

否则,DataFrameReader 会推断默认方言使用“””作为报价标识符。因此,通过 spark.read.jdbc 的查询被发送为

从表中选择“id”、“col2”、“col3”、“etc”

它选择字符串表示而不是列值而不是

从表中选择 id、col2、col3 等

4

2 回答 2

7

也许为时已晚。但答案将是下一个:

创建您的自定义方言,就像我为 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)
于 2017-08-17T19:18:00.863 回答
0

你可以做这样的事情。

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

有关更多信息,请查看

您也可以通过这种方式指定。

val connectionProperties = new Properties()
    connectionProperties.put("user", "username")
    connectionProperties.put("password", "password")
    val jdbcDF2 = spark.read
      .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)
于 2016-11-02T04:38:37.677 回答