使用Scala和spark从mysql中提取数据

时间:2017-11-20 17:37:59

标签: mysql scala apache-spark

我尝试运行Scala程序从mysql retail_db数据库中提取数据。它抛出SQLException。

这是我的代码:

import java.sql.DriverManager
import java.sql.Connection

case class Categories(id: Int, department: String, name: String){
  override def toString: String = {"id: " + id + "department: " + department + "name: " + name}
}
object Orders {
  def main(args: Array[String]): Unit ={
    val driver = "com.mysql.jdbc.Driver"
    val url = "jdbc:mysql://quickstart.cloudera:3306/retail_db"
    val username = "root"
    val password = "cloudera"
    Class.forName(driver)
    val connection = DriverManager.getConnection(url, username, password)
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery(s"SELECT * FROM categories")

    while (resultSet.next()){
      val e = Categories(resultSet.getInt("id"),
        resultSet.getString("department"),
        resultSet.getString("name"))
         println(e)
    }
  }
}

Spark提交命令:

spark-submit --class "Orders" \
--master local < path >/scala_2.10-0.1-SNAPSHOT.jar

例外:

  

线程中的异常&#34; main&#34; java.sql.SQLException:Column&#39; id&#39;不   发现&#34; **

1 个答案:

答案 0 :(得分:1)

很简单,在类表中没有名为id的列(或者它不是Int)。我建议运行

val resultSet = statement.executeQuery("SHOW COLUMNS FROM categories")

首先返回表格的description然后

   while (resultSet.next()){
           println(resultSet.getString("Field"))
           println(resultSet.getString("Type"))
    }

通过这种方式,您可以看到实际的字段名称和类型。 当然,这假设您无法访问MySQL的主机或其他 你应该只需手动连接并查看表结构。

编辑: JDBC URL看起来很熟悉,它来自cloudera的quickstart VM。无论如何,表的模式是here,因此您可以看到它不是id而是category_id。