Настройка производительности чтения Spark jdbc без столбца первичного ключа - PullRequest
0 голосов
/ 26 сентября 2019

Я использую аналитическое приложение spark и читаю таблицу MSSQL Server (всю таблицу) напрямую, используя spark jdbc.В этой таблице содержится более 30 миллионов записей, но нет столбца первичного ключа или целочисленного столбца.Так как в таблице нет такого столбца, я не могу использовать 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).

1 Ответ

1 голос
/ 26 сентября 2019

Единственный способ - написать запрос, возвращающий разделенные данные, и указать параметр 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 может разделить операцию чтенияи в то же время может ускорить запрос на чтение.

...