如何在azure数据块中使用ucanaccess(ms Access jdbc驱动程序)?

时间:2019-05-03 00:49:09

标签: ms-access jdbc pyspark ucanaccess azure-databricks

我正在使用azure数据块,并尝试作为ETL程序的一部分读取.mdb文件。经过研究,我发现唯一用于ms访问(.mdb)格式的jdbc连接器是“ ucanaccess”。我已经按照azure上的一些教程进行了有关如何连接到jdbc数据源的教程,一开始连接似乎很成功,但是有些奇怪的行为没有任何意义。

对于其中之一,由于存在不同的数据类型错误,因此我实际上无法查询数据帧。 .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失败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,值:项目编号“

鉴于此错误,我决定尝试查询特定的字符串列,以至少测试其他数据类型。当我表演

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 个答案:

答案 0 :(得分:1)

与ucanaccess jdbc驱动程序一起使用spark时,我遇到了类似的问题。

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