SQL запрос занимает слишком много времени в azure блоках данных - PullRequest
1 голос
/ 10 июля 2020

Я хочу выполнить SQL запрос к базе данных, которая находится в Azure SQL управляемом экземпляре, используя Azure Databricks. Я подключился к базе данных с помощью искрового разъема.

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
  "url"          -> "mysqlserver.database.windows.net",
  "databaseName" -> "MyDatabase",
  "queryCustom"  -> "SELECT TOP 100 * FROM dbo.Clients WHERE PostalCode = 98074" //Sql query
  "user"         -> "username",
  "password"     -> "*********",
))

//Read all data in table dbo.Clients
val collection = sqlContext.read.sqlDB(config)
collection.show()

Я использую вышеуказанный метод для получения данных (пример из MSFT do c). В моем случае размеры таблиц превышают 10M. Мой вопрос: как Databricks обрабатывает запрос здесь?

Ниже приведена документация: Главный узел Spark подключается к базам данных в SQL базе данных или SQL сервере и загружает данные из указанного c таблицу или используя специальный запрос c SQL. Главный узел Spark распределяет данные по рабочим узлам для преобразования. Узел Worker подключается к базам данных, которые подключаются к SQL Database и SQL Server, и записывает данные в базу данных. Пользователь может выбрать использование построчной или массовой вставки.

В нем говорится, что главный узел извлекает данные и распределяет работу по рабочим узлам позже. В приведенном выше коде при извлечении данных что делать, если сам запрос сложен и требует времени? Распространяет ли он работу на рабочие узлы? или мне нужно сначала получить данные таблиц в Spark, а затем запустить запрос SQL, чтобы получить результат. Какой метод вы предлагаете?

1 Ответ

1 голос
/ 10 июля 2020

Таким образом, при использовании вышеуказанного метода используется одно соединение JDB C для переноса таблицы в среду Spark. И если вы хотите использовать предикат pu sh down в запросе, вы можете использовать это следующим образом.

val pushdown_query = "(select * from employees where emp_no < 10008) emp_alias"
val df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, 
properties=connectionProperties)
display(df)

Если вы хотите повысить производительность, вам нужно управлять параллелизмом во время чтения. Вы можете указать границы разделения на основе значений столбца набора данных.

Эти параметры определяют параллелизм при чтении. Все эти параметры должны быть указаны, если указан какой-либо из них. lowerBound и upperBound определяют шаг раздела, но не фильтруют строки в таблице. Таким образом, Spark разбивает и возвращает все строки в таблице.

В следующем примере таблица, прочитанная между исполнителями в столбце emp_no, разбивается с использованием параметров columnName, lowerBound, upperBound и numPartitions.

val df = (spark.read.jdbc(url=jdbcUrl,
    table="employees",
    columnName="emp_no",
    lowerBound=1L,
    upperBound=100000L,
    numPartitions=100,
    connectionProperties=connectionProperties))
display(df)

Для получения дополнительной информации: используйте эту ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...