如何在 Azure Data Bricks 中使用 ucanaccess (ms access jdbc driver)?

问题描述 投票:0回答:2

我正在使用 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)

这里返回的结果是一个数据框 (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.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 文件不是很常见,所以我觉得我的选择可能受限于我可以用来解析数据的内容。

ms-access jdbc pyspark ucanaccess azure-databricks
2个回答
1
投票

在将 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)

-3
投票

运行该查询后,

如何在数据块中读取 mdb 文件的表?

© www.soinside.com 2019 - 2024. All rights reserved.