spark-shell连接数据库java.sql.SQLSyntaxErrorException: Unknown databas

完整报错如下:

2020-05-05 11:16:50 WARN  TaskSetManager:66 - Lost task 1.0 in stage 9.0 (TID 47, Laptop, executor 2): java.sql.SQLSyntaxErrorException: Unknown database 'leaf'
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
    at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at $line57.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(:28)
    at $line57.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(:26)
    at org.apache.spark.rdd.JdbcRDD$$anon$1.(JdbcRDD.scala:82)
    at org.apache.spark.rdd.JdbcRDD.compute(JdbcRDD.scala:78)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    at org.apache.spark.scheduler.Task.run(Task.scala:109)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)

ArrayBuffer()

测试代码是:

import java.sql.DriverManager
import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}


object One extends App {
val con = new SparkConf().setAppName("rddmysql").setMaster("yarn")
  val sc = new SparkContext(con)

#---------------------下面是spark-shell部分----------------------------

  //********************************直接从mysql中读取数据(并且加条件)
  val getcon=()=>{
    Class.forName("com.mysql.cj.jdbc.Driver").newInstance()
    DriverManager.getConnection("jdbc:mysql://Desktop:3306/leaf","appleyuchi","appleyuchi")
  }
  
  val jdbcmysql=new JdbcRDD(
    sc,  //sc程序入口
    getcon,  // 数据库连接
    "select * from spark where num >=? and num <=?",  //条件查询语句
    339233,  //最小值
    3395045,  //最大值
    2,  //partition分区
    ressultSet=>{//返回内容(获取内容)   ressultSet是自己起的别名,可以随便起   id和age的下标是由它在你数据库中的位置决定的
      val id =ressultSet.getInt(1)
      val age =ressultSet.getInt(2)
      (id,age)  //返回
    }
  )


 // ,然后再把age等于18的数据取出
 val jdbcmysql2 =  jdbcmysql.filter(x=>x._2==1935)
  //再把过滤后的数据保存到mysql中(自己在mysql中创建数据,有id和age)
  println(jdbcmysql2.collect().toBuffer)
  //*****************************将数据用RDD直接存到mysql中
  jdbcmysql2.foreachPartition(x=>{
    val con = DriverManager.getConnection("jdbc:mysql://Desktop:3306/leaf","appleyuchi","appleyuchi")  //建立连接
    val eq = con.prepareStatement("insert into spark values(?,?)")  //添加sql语句。需要提前在mysql中建好结构相同的表
    x.foreach(t=>{
      eq.setInt(1,t._1)
      eq.setInt(2,t._2)
      eq.executeUpdate()
    })
    eq.close()
    con.close()
  })
#---------------------上面是spark-shell部分----------------------------

  sc.stop()
}


 

错误分析:

明明数据库是存在的,为什么说unknown,凭我们的功底,sql语法肯定不会出错,那么问题到底在哪里?

解决方案:

https://gitee.com/appleyuchi/cluster_configuration/blob/master/物理环境配置流程-必须先看.txt

 

你可能感兴趣的:(Scala与Spark)