Spark jdbc读取性能调整,无主键列

问题描述 投票:0回答:1

我正在使用spark jdbc,并且正在读取Oracle和MSSQL Server表(整个表)。这些表具有超过3000万条记录,但是没有任何主键列或整数列。由于表中没有这样的列,因此我无法使用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)。

scala apache-spark apache-spark-sql spark-jdbc
1个回答
0
投票

唯一的方法是编写一个查询,该查询返回已分区的数据,并在生成的新列中指定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操作可以拆分读取操作,同时可以加快读取查询的速度。

© www.soinside.com 2019 - 2024. All rights reserved.