我正在使用 azure data bricks 并尝试读取 .mdb 文件作为 ETL 程序的一部分。在做了一些研究之后,我发现的唯一用于 ms access (.mdb) 格式的 jdbc 连接器是“ucanaccess”。我遵循了一些关于如何连接到 jdbc 数据源的 azure 教程,起初连接似乎是成功的,但是有一些奇怪的行为没有任何意义。
首先,我实际上无法查询数据框,因为存在不同的数据类型错误。 .mdb 文件中的每个表都会发生这种情况。
connectionProperties = {
"driver" : "net.ucanaccess.jdbc.UcanaccessDriver"
}
url = "jdbc:ucanaccess:///dbfs/mnt/pre-processed/[email protected]/DD/DAILIES/5-1-19/MD190062.MDB"
df = spark.read.jdbc(url=url, table="tblbhaitems", properties=connectionProperties)
现在,尝试从数据框中实际获取数据,我收到以下错误:
df.select("*").show()
错误:“org.apache.spark.SparkException:作业因阶段失败而中止:阶段 0.0 中的任务 0 失败 4 次,最近的失败:阶段 0.0 中丢失任务 0.3(TID 3、10.139.64.6,执行程序 0): net.ucanacess.jdbc.UcanaccessSQLException:UCAExc:::4.0.4 不兼容数据类型转换:从 SQL 类型 CHARACTER 到 java.lang.Integer,值:Item No"
看到这个错误,我决定尝试查询特定的字符串列以至少测试其他数据类型。当我表演
df.select("`Job no ID`").show()
我为该表的每一行值重复列名:
+---------+
|Job no ID|
+---------+
|Job no ID|
|Job no ID|
|Job no ID|
|Job no ID|
|Job no ID|
+---------+
我完全不知道为什么它连接并看到列但实际上没有获取任何数据。不幸的是,.mdb 文件不是很常见,所以我觉得我的选择可能受限于我可以用来解析数据的内容。
在将 spark 与 ucanacess jdbc 驱动程序一起使用时,我遇到了与您提到的类似的问题。
在 spark 中,我们可以为 ucanaccess jdbc 驱动程序创建和注册自定义 jdbc 方言,如下所示:
import org.apache.spark.sql.jdbc.{JdbcDialect, JdbcDialects}
case object MSAccessJdbcDialect extends JdbcDialect {
override def canHandle(url: String): Boolean = url.startsWith("jdbc:ucanaccess")
override def quoteIdentifier(colName: String): String = s"[$colName]"
}
JdbcDialects.registerDialect(MSAccessJdbcDialect)
运行该查询后,
如何在数据块中读取 mdb 文件的表?