I'm having an issue reading data via custom JDBC with Spark. How would I go about about overriding the sql dialect inferred via jdbc url?
The database in question is vitess (https://github.com/youtube/vitess) which runs a mysql variant, so I want to specify a mysql dialect.
The jdbc url begins with jdbc:vitess/
Otherwise the DataFrameReader is inferring a default dialect which uses """ as a quote identifier. As a result, queries via spark.read.jdbc get sent as
Select 'id', 'col2', col3', 'etc' from table
which selects the string representations instead of the column values
instead of
Select id, col2, col3, etc from table
Maybe it's too late. But answer will be next:
Create your custom dialect, as I did for ClickHouse database(my jdbc connection url looks like this 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")
}
And register it somewhere in your code, like this:
JdbcDialects.registerDialect(ClickHouseDialect)
You can do something like this.
val jdbcDF = spark.read
.format("jdbc")
.option("url", "jdbc:postgresql:dbserver")
.option("dbtable", "schema.tablename")
.option("user", "username")
.option("password", "password")
.load()
For more info check this
You can also specify in this way.
val connectionProperties = new Properties()
connectionProperties.put("user", "username")
connectionProperties.put("password", "password")
val jdbcDF2 = spark.read
.jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)