如何在 Azure 数据砖中使用 ucanaccess(ms 访问 jdbc 驱动程序)?
Posted
技术标签:
【中文标题】如何在 Azure 数据砖中使用 ucanaccess(ms 访问 jdbc 驱动程序)?【英文标题】:How to use ucanaccess (ms access jdbc driver) in azure data bricks? 【发布时间】:2019-05-03 00:49:08 【问题描述】:我正在使用 azure 数据块并尝试在 ETL 程序中读取 .mdb 文件。在做了一些研究之后,我发现的唯一用于 ms 访问 (.mdb) 格式的 jdbc 连接器是“ucanaccess”。我已经关注了一些关于如何连接到 jdbc 数据源的 azure 教程,起初连接似乎成功,但有一些奇怪的行为没有任何意义。
一方面,我实际上无法查询数据框,因为存在不同的数据类型错误。 .mdb 文件中的每个表都会发生这种情况。
connectionProperties =
"driver" : "net.ucanaccess.jdbc.UcanaccessDriver"
url = "jdbc:ucanaccess:///dbfs/mnt/pre-processed/aeaton@legacydirectional.com/DD/DAILIES/5-1-19/MD190062.MDB"
df = spark.read.jdbc(url=url, table="tblbhaitems", properties=connectionProperties)
这里的结果是一个正在返回的数据框 (data frame returned)
现在,尝试从数据框中实际获取数据,我收到以下错误:
df.select("*").show()
错误:“org.apache.spark.SparkException:作业因阶段故障而中止:阶段 0.0 中的任务 0 失败 4 次,最近一次失败:阶段 0.0 中丢失任务 0.3(TID 3, 10.139.64.6,执行程序 0 ): net.ucanaccess.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 文件不是很常见,所以我觉得我的选择可能仅限于我可用于解析数据的内容。
【问题讨论】:
【参考方案1】:在将 spark 与 ucanaccess 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)
【讨论】:
以上是关于如何在 Azure 数据砖中使用 ucanaccess(ms 访问 jdbc 驱动程序)?的主要内容,如果未能解决你的问题,请参考以下文章
call, apply, bind 函数能干啥?如何在日常搬砖中使用?(全)
call, apply, bind 函数能干啥?如何在日常搬砖中使用?(全)