关于spark SQL读取传统数据库的效率问题

配置的方式:

    val readOpts = Map[String, String]("numPartitions" -> "3", "partitionColumn" -> "id",
      "lowerBound" -> "3", "upperBound" -> "8", "fetchsize" -> "100")
    val jdbcDF = spark.read.options(readOpts).jdbc(mysqlUrl, "person", properties)
  参数讲解:
    //按照某个分区字段进行分区读数据 分区读数据,就会快很多
    //partitionColumn 分区的字段,这个字段必须是integral类型的
    //lowerBound  用于决定分区步数的partitionColumn的最小值
    //upperBound  用于决定分区步数的partitionColumn的最大值
    //numPartitions 分区数,和lowerBound以及upperBound一起来为每一个分区生成sql的where字句
    //如果upperBound - lowerBound >= numPartitions,那么我们就取numPartitions个分区,
    // 否则我们取upperBound - lowerBound个分区数
    // 8 - 3 = 5 > 3 所以我们取3个分区
    // where id < 3 + 1 这个1是通过 8/3 - 3/3 = 1得来的  3是lowerBound
    // where id >= 3 + 1 and id < 3 + 1 + 1  1都是步长
    // where id >= 3 + 1 + 1  剩下的那个分区
    // fetchsize 批量查的数据量  一次性读多少数据

api的方式:

spark.read.jdbc(mysqlUrl, “person”, “id”, 3, 8, 3, properties).show() // 注意,这些参数指定了一个就必须要指定全部

指定的方式:
val conditionDF = spark.read.jdbc(mysqlUrl,
“person”, Array(“id > 2 and id < 5”, “id >= 5 and id < 8”), properties)

注意事项:

	//每次读取的时候,可以采用batch的方式读取数据,batch的数量可以由参数fetchsize来设置。默认为:0,表示jdbc的driver来估计这个batch的大小

    //不管是读还是写,都有分区数的概念,
    // 读的时候是通过用户设置numPartitions参数设置的,
    // 而写的分区数是DataFrame的分区数
    //需要注意一点的是不管是读还是写,每一个分区都会打开一个jdbc的连接,所以分区不宜太多,要不然的话会搞垮数据库
    //写的时候,可以通过DataFrame的coalease接口来减少分区数

补充:关于spark SQL读取传统数据库的效率问题_第1张图片
这种方式,spark底层实现是使用的连接池,因此,不用担心把数据库搞垮

你可能感兴趣的:(spark)