Skip to content

Commit 0c999ce

Browse files
Fixing data frame write error to DB2 using jdbc. Adding db2 dialect to map string, boolean to valid db2 types on write.
1 parent 053d94f commit 0c999ce

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

sql/core/src/main/scala/org/apache/spark/sql/jdbc/JdbcDialects.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ object JdbcDialects {
125125

126126
registerDialect(MySQLDialect)
127127
registerDialect(PostgresDialect)
128+
registerDialect(DB2Dialect)
128129

129130
/**
130131
* Fetch the JdbcDialect class corresponding to a given database url.
@@ -222,3 +223,20 @@ case object MySQLDialect extends JdbcDialect {
222223
s"`$colName`"
223224
}
224225
}
226+
227+
/**
228+
* :: DeveloperApi ::
229+
* Default DB2 dialect, mapping string/boolean on write to valid DB2 types.
230+
* By default string, and boolean gets mapped to db2 invalid types TEXT, and BIT(1).
231+
*/
232+
@DeveloperApi
233+
case object DB2Dialect extends JdbcDialect {
234+
235+
override def canHandle(url: String): Boolean = url.startsWith("jdbc:db2")
236+
237+
override def getJDBCType(dt: DataType): Option[JdbcType] = dt match {
238+
case StringType => Some(JdbcType("CLOB", java.sql.Types.CLOB))
239+
case BooleanType => Some(JdbcType("CHAR(1)", java.sql.Types.CHAR))
240+
case _ => None
241+
}
242+
}

sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ class JDBCSuite extends SparkFunSuite with BeforeAndAfter with SharedSQLContext
407407
test("Default jdbc dialect registration") {
408408
assert(JdbcDialects.get("jdbc:mysql://127.0.0.1/db") == MySQLDialect)
409409
assert(JdbcDialects.get("jdbc:postgresql://127.0.0.1/db") == PostgresDialect)
410+
assert(JdbcDialects.get("jdbc:db2://127.0.0.1/db") == DB2Dialect)
410411
assert(JdbcDialects.get("test.invalid") == NoopDialect)
411412
}
412413

@@ -443,4 +444,10 @@ class JDBCSuite extends SparkFunSuite with BeforeAndAfter with SharedSQLContext
443444
assert(agg.getCatalystType(0, "", 1, null) === Some(LongType))
444445
assert(agg.getCatalystType(1, "", 1, null) === Some(StringType))
445446
}
447+
448+
test("DB2Dialect type mapping") {
449+
val db2Dialect = JdbcDialects.get("jdbc:db2://127.0.0.1/db")
450+
assert(db2Dialect.getJDBCType(StringType).map(_.databaseTypeDefinition).get == "CLOB")
451+
assert(db2Dialect.getJDBCType(BooleanType).map(_.databaseTypeDefinition).get == "CHAR(1)")
452+
}
446453
}

0 commit comments

Comments
 (0)