scala - 无主键列的 Spark jdbc 读取性能调优
问题描述
我正在运行 spark 分析应用程序并直接使用 spark 读取 MSSQL Server 表(整个表)jdbc
。该表有超过 30M 的记录,但没有任何主键列或整数列。由于表格没有这样的列,我无法使用partitionColumn
,因此在阅读表格时需要花费太多时间。
val datasource = spark.read.format("jdbc")
.option("url", "jdbc:sqlserver://host:1433;database=mydb")
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.option("dbtable", "dbo.table")
.option("user", "myuser")
.option("password", "password")
.option("useSSL", "false").load()
在这种情况下,有什么方法可以提高性能,并在从关系数据库源(源可能是 Oracle、MSSQL Server、MySQL、DB2)读取数据时使用并行性。
解决方案
唯一的方法是编写一个返回分区数据的查询,并将 partitionColumn 指定到生成的新列中,但我不知道这是否真的可以加速您的摄取。
例如在伪 sql 代码中:
val myReadQuery = SELECT *,(rowid %5) as part from table
之后
val datasource = spark.read.format("jdbc")
.option("url", "jdbc:sqlserver://host:1433;database=mydb")
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.option("dbtable", s"($myReadQuery) as t")
.option("user", "myuser")
.option("password", "password")
.option("useSSL", "false").
.option("numPartitions", 5)
.option("partitionColumn", "part")
.option("lowerBound", 1)
.option("upperBound", 5).load()
但是我已经说过了,我不确定这是否可以改善您的摄取。因为这会导致这样的 5 个并行查询:
SELECT * from (select *, (rowid%5) as part from table) where part >= 0 and part < 1
SELECT * from (select *, (rowid%5) as part from table) where part >= 1 and part < 2
SELECT * from (select *, (rowid%5) as part from table) where part >= 2 and part < 3
SELECT * from (select *, (rowid%5) as part from table) where part >= 3 and part < 4
SELECT * from (select *, (rowid%5) as part from table) where part >= 4 and part < 5
但我认为如果在你的表中有一个索引,你可以使用索引来提取一个整数,通过 mod 操作可以拆分读取操作,同时可以加快读取查询。
推荐阅读
- three.js - ThreeJS Vertices and Faces optimization
- swift - 无法在 swift 中使用 kanna 将 url 转换为 html
- python - 使用 cx_Freeze 将 Python 项目转换为 .exe 文件
- c# - 如何避免从值类型的输出参数到接口的装箱?
- node.js - Google Calendar API Node JS,无法使用服务帐户添加与会者
- excel - 在 MS Word (Office 365) 中跨嵌入式 Excel 工作表使用公式
- ios - SwiftUI 动画:如何延迟重复动画
- javascript - Material-ui Autucomplete:指定自定义 CloseIconButton
- tfs - 通过 REST API 为 Azure DevOps“创建工作项的副本”?
- php - 不显示 CUSTOM ERROR 403,而是显示默认错误