如何在 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 驱动程序)?的主要内容,如果未能解决你的问题,请参考以下文章

Spark-sql 数据砖中的变量动态分配值

call, apply, bind 函数能干啥?如何在日常搬砖中使用?(全)

call, apply, bind 函数能干啥?如何在日常搬砖中使用?(全)

意外令牌:AS(使用 UCanAcces.jar)

netBeans 和 ucanacces sql 异常仅从代码中调用 db

如何使用 Azure 数据工厂管道创建容器?