如何在scala中读取.MDB文件

时间:2017-05-26 07:45:02

标签: scala ms-access apache-spark jackcess

我有将.mdb文件转换为.csv文件的任务。在下面的代码的帮助下,我只能从.mdb文件中读取一个表文件。我无法读取.mdb文件是否包含多个表,我想单独存储所有文件。请帮助我。

object mdbfiles {

    Logger.getLogger("org").setLevel(Level.ERROR)

    val spark = SparkSession.builder().appName("Positional File Reading").master("local[*]").getOrCreate()

     val sc = spark.sparkContext // Just used to create test RDDs

     def main(args: Array[String]): Unit = { 

         val inputfilepath = "C:/Users/phadpa01/Desktop/InputFiles/sample.mdb"

         val outputfilepath ="C:/Users/phadpa01/Desktop/sample_mdb_output"

         val db = DatabaseBuilder.open(new File(inputfilepath))

         try  {

             val table = db.getTable("table1");

            for ( row <- table) {
                //System.out.println(row)
                val opresult = row.values()
            }

        } 

    }

}

2 个答案:

答案 0 :(得分:1)

您的问题是您只使用此位代码调用一个表

val table = db.getTable("table1");

您应该在db中获取可用表的列表,然后循环它们。

val tableNames = db.getTableNames

然后你可以迭代tableNames。这应该可以解决您在多个表中阅读的问题。您可能需要更新其余代码以获得它想要的效果。

答案 1 :(得分:1)

您应该找到一个与MS Access一起使用的JDBC驱动程序,而不是手动尝试自己解析文件。

例如UCanAccess

然后,它是一个简单的SparkSQL命令,你有一个DataFrame

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:ucanaccess://c:/Users/phadpa01/Desktop/InputFiles/sample.mdb;memory=false")
  .option("dbtable", "table1")
  .load()

一行到CSV

jdbcDF.write.format("csv").save("table1.csv")
  

不要忘记将UcanAccess jar插入上下文:   ucanaccess-4.0.2.jar,jackcess-2.1.6.jar,的hsqldb.jar

Alernative solution

运行终端命令

http://ucanaccess.sourceforge.net/site.html#clients