[小技巧]分批取数据库数据

        在有些业务场景中需要分批去取数据库表中的全部数据来进行处理,最简单的方法就是使用分页查询语句(偷懒以mysql为例):

select * from datatable limit offset,amount

        这里就会有一个问题,随着offset值的越来越大,这条sql要扫描的表数据就会越来越多,因为要定位到offset这一行就需要扫描比offset小的所有行。显然在一张大数据量的表中,去这样做,性能就会出问题。为了避免这样的情形出现,我们自然会想到使用索引来解决,比如使用自增序列id进行分批取:

select * from datatable where id >= start and id<start+batchCount

        这样我们对id建索引,然后分批去取,显然效果会高很多,但是如果自增序列由于删除等操作变得不是连续,就会出现空执行和多执行的情况出现。要解决这个方法,我们就需要结合使用索引和分页的优势来处理:

select * from datatable where id >= start limit batchCount

        然后每次取回来我们再计算出起始id值,再去取下一批数据。这样就可以既避免了第一种不走索引,查询性能低下的问题,又解决了第二种id不连续,导致取回来的数据量不稳定导致浪费的问题了。


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Spark SQL中,可以使用分区读或者分批来提高读数据库数据的性能。 分区读是指将表按照某个字段的值进行分区,每个分区都可以独立地进行读和处理。这种方式适用于表中某个字段的值分布比较均匀的情况。在Spark SQL中,可以使用`partitionColumn`参数来指定分区字段,使用`lowerBound`和`upperBound`参数来指定分区范围,使用`numPartitions`参数来指定分区数。 分批是指将表按照一定大小进行分批,每批数据都可以独立地进行处理。这种方式适用于表中某个字段的值分布不均匀,或者需要定期地增量读数据的情况。在Spark SQL中,可以使用`fetchSize`参数来指定每批数据的大小,使用`lowerBound`和`upperBound`参数来指定数据范围。 下面是一个使用分批的例子: ```scala import org.apache.spark.sql.{DataFrame, SQLContext} class DatabaseReader(sqlContext: SQLContext) { val url = "jdbc:mysql://localhost:3306/test" val user = "root" val password = "root" def readTable(tableName: String, batchSize: Int): DataFrame = { val jdbcDF = sqlContext.read.format("jdbc") .option("url", url) .option("dbtable", tableName) .option("user", user) .option("password", password) .option("fetchSize", batchSize) .option("lowerBound", 0) .option("upperBound", 1000000) .option("numPartitions", 10) .load() jdbcDF } } val reader = new DatabaseReader(sqlContext) val df = reader.readTable("mytable", 1000) ``` 在这个例子中,我们使用`fetchSize`参数来指定每批数据的大小为1000,使用`lowerBound`和`upperBound`参数来指定数据范围为0到1000000,使用`numPartitions`参数来指定分区数为10。这样就可以按照每批1000条数据进行读,并且可以并行地进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值