pyspark读取数据库性能优化

当数据量很大时,读取方式

dbtable写sql语句

dbtable和query配置不能同时存在,选一种即可。里面都可以直接写sql语句

python 复制代码
jdbcDF = spark.read.format("jdbc")\
    .option("driver",driver)\
    .option("url",url)\
    .option("dbtable","(select * from my_table where class='01' and sex='M' )")\
    .option("user",user)\
    .option("password",password)\
		.load().select("org_code","operate_id")

如果dbtable是一个表,如果load()后进行where和select,都会把整张表加载进来,耗内存。直接写sql语句比较好。

并行方式读取数据库

一般来说,默认读数据库,numPartition是1。

以下代码使得读取数据库并行读是10。

python 复制代码
jdbcDF = spark.read.format("jdbc")\
    .option("driver",driver)\
    .option("url",url)\
    .option("dbtable","(select * from my_table where class='01' and sex='F' )")\
    .option("user",user)\
    .option("password",password)\
		.option("numPartitions",10)\
		.option("partitionColumn","id")\
		.option("lowerBound",0)\
		.option("upperBound",100000)
		.load().select("org_code","operate_id")

numPartitions是设置的最大分区数。(单独设置这一选项,没有设置partitionColumn,lowerBound,upperBound,我怎么试实际运行numPartitions值都是1。大概是spark不知道怎么分割分区)

partitionColumn,lowerBound,upperBound这三个选项必须同时设置。(upperBound-lowerBound)/numPartitions是步长。即使数据内容低于lowerBound,或高于upperBound,依然会把所有数据都加载进来。

比如设置partitionColumn为id列,lowerBound为100,upperBound为400,numPartitions为3,实际内容有小于100的,也有大于300的。

那么第一个分区是低于200的,第二个分区是[200,300),第三个分区是大于等于300的

partitionColumn列的值必须是numeric, date, 或 timestamp类型的。

如果是date类型,可以写.option("lowerBound","2023-01-01")

如果是timestamp类型,可以写.option("lowerBound","2023-01-01 00:00:00")

相关推荐
杨云龙UP1 分钟前
MySQL 主从复制管理:暂停、恢复、清理主从关系及命令执行位置
运维·数据库·mysql·主从配置·主从命令·reset replica·清除复制
yzs8718 分钟前
openGauss branch diff能力解析
数据库·oracle
郭小李28 分钟前
spring中@Transactional注解对事务的支持
数据库·spring·oracle
运维行者_30 分钟前
供应链安全成最大风险源,企业如何构建可控的运维体系?
运维·开发语言·网络·数据库·安全·云计算·流量监控
高铭杰32 分钟前
Postgresql源码(160)新的共享内存注册机制,为动态调整shared_buffers打基础
数据库·postgresql
数据库小学妹44 分钟前
AI Agent连数据库怎么控权限?只读账号的4个缺口
数据库·人工智能·安全·数据库权限·审计·ai数据库·只读账号
瑞克-桑切斯1 小时前
6、MySQL 总结
数据库
凤凰院凶涛QAQ1 小时前
《MySQL内核拆解:从SQL到InnoDB》(三) : 数据库设计 & 聚合查询 & 分组查询
数据库·sql·mysql
Decay__2 小时前
01_MySQL 体系架构全解 —— 连接层、SQL 层、存储引擎层与 InnoDB 深入
运维·数据库·sql·mysql·架构
Linux_cy2 小时前
nginx 502 排查手册:九种原因分类、定位命令与检查顺序
linux·运维·服务器·网络·数据库·nginx·ssh