Поделиться через


Запрос данных в Azure Synapse Analytics

Вы можете получить доступ к Azure Synapse из Azure Databricks с помощью соединителя Azure Synapse, который использует COPY инструкцию в Azure Synapse для эффективной передачи больших объемов данных между кластером Azure Databricks и экземпляром Azure Synapse с помощью учетной записи хранения Azure Data Lake Storage 2-го поколения для временного промежуточного хранения.

Внимание

Конфигурации, описанные в этой статье, являются экспериментальными. Экспериментальные функции предоставляются как есть и не поддерживаются Databricks через техническую поддержку клиентов. Чтобы получить полную поддержку федерации запросов, следует вместо этого использовать федерацию Lakehouse, которая позволяет пользователям Azure Databricks воспользоваться синтаксисом каталога Unity и средствами управления данными.

Azure Synapse Analytics — это облачное хранилище корпоративных данных, которое использует массовую параллельную обработку (MPP) для быстрого выполнения сложных запросов в петабайтах данных.

Внимание

Этот соединитель предназначен только для использования с экземплярами выделенного пула Synapse и несовместим с другими компонентами Synapse.

Примечание.

COPYдоступен только в Azure Data Lake Storage 2-го поколения экземплярах. Если вы ищете подробные сведения о работе с Polybase, см . статью "Подключение Azure Databricks и Azure Synapse с PolyBase (устаревшая версия)".

Пример синтаксиса для Synapse

Synapse можно запросить в Scala, Python, SQL и R. В следующих примерах кода используются ключи учетной записи хранения и перенаправлять учетные данные хранения из Azure Databricks в Synapse.

Примечание.

Используйте строка подключения, предоставляемые портал Azure, что обеспечивает шифрование протокола SSL для всех данных, отправленных между драйвером Spark и экземпляром Azure Synapse через подключение JDBC. Чтобы убедиться, что шифрование SSL включено, найдите подстроку encrypt=true в строке подключения.

Внимание

Внешние расположения, определенные в каталоге Unity, не поддерживаются в качестве tempDir расположений.

Scala


// Set up the storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

// Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 11.3 LTS and above.
val df: DataFrame = spark.read
  .format("sqldw")
  .option("host", "hostname")
  .option("port", "port") /* Optional - will use default port 1433 if not specified. */
  .option("user", "username")
  .option("password", "password")
  .option("database", "database-name")
  .option("dbtable", "schema-name.table-name") /* If schemaName not provided, default to "dbo". */
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .load()

// Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 10.4 LTS and below.
val df: DataFrame = spark.read
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("dbTable", "<your-table-name>")
  .load()

// Load data from an Azure Synapse query.
val df: DataFrame = spark.read
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("query", "select x, count(*) as cnt from table group by x")
  .load()

// Apply some transformations to the data, then use the
// Data Source API to write the data back to another table in Azure Synapse.

df.write
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("dbTable", "<your-table-name>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .save()

Python


# Set up the storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

# Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 11.3 LTS and above.
df = spark.read
  .format("sqldw")
  .option("host", "hostname")
  .option("port", "port") # Optional - will use default port 1433 if not specified.
  .option("user", "username")
  .option("password", "password")
  .option("database", "database-name")
  .option("dbtable", "schema-name.table-name") # If schemaName not provided, default to "dbo".
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .load()

# Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 10.4 LTS and below.
df = spark.read \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "<your-table-name>") \
  .load()

# Load data from an Azure Synapse query.
df = spark.read \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("query", "select x, count(*) as cnt from table group by x") \
  .load()

# Apply some transformations to the data, then use the
# Data Source API to write the data back to another table in Azure Synapse.

df.write \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "<your-table-name>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .save()

SQL


-- Set up the storage account access key in the notebook session conf.
SET fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net=<your-storage-account-access-key>;

-- Read data using SQL. The following example applies to Databricks Runtime 11.3 LTS and above.
CREATE TABLE example_table_in_spark_read
USING sqldw
OPTIONS (
  host '<hostname>',
  port '<port>' /* Optional - will use default port 1433 if not specified. */
  user '<username>',
  password '<password>',
  database '<database-name>'
  dbtable '<schema-name>.<table-name>', /* If schemaName not provided, default to "dbo". */
  forwardSparkAzureStorageCredentials 'true',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
);

-- Read data using SQL. The following example applies to Databricks Runtime 10.4 LTS and below.
CREATE TABLE example_table_in_spark_read
USING com.databricks.spark.sqldw
OPTIONS (
  url 'jdbc:sqlserver://<the-rest-of-the-connection-string>',
  forwardSparkAzureStorageCredentials 'true',
  dbtable '<your-table-name>',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
);

-- Write data using SQL.
-- Create a new table, throwing an error if a table with the same name already exists:

CREATE TABLE example_table_in_spark_write
USING com.databricks.spark.sqldw
OPTIONS (
  url 'jdbc:sqlserver://<the-rest-of-the-connection-string>',
  forwardSparkAzureStorageCredentials 'true',
  dbTable '<your-table-name>',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
)
AS SELECT * FROM table_to_save_in_spark;

R

# Load SparkR
library(SparkR)

# Set up the storage account access key in the notebook session conf.
conf <- sparkR.callJMethod(sparkR.session(), "conf")
sparkR.callJMethod(conf, "set", "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net", "<your-storage-account-access-key>")

# Get some data from an Azure Synapse table.
df <- read.df(
   source = "com.databricks.spark.sqldw",
   url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
   forward_spark_azure_storage_credentials = "true",
   dbTable = "<your-table-name>",
   tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

# Load data from an Azure Synapse query.
df <- read.df(
   source = "com.databricks.spark.sqldw",
   url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
   forward_spark_azure_storage_credentials = "true",
   query = "select x, count(*) as cnt from table group by x",
   tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

# Apply some transformations to the data, then use the
# Data Source API to write the data back to another table in Azure Synapse.

write.df(
  df,
  source = "com.databricks.spark.sqldw",
  url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
  forward_spark_azure_storage_credentials = "true",
  dbTable = "<your-table-name>",
  tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

Как работает проверка подлинности между Azure Databricks и Synapse?

Соединитель Azure Synapse использует три типа сетевых подключений:

  • Драйвер Spark — к Azure Synapse
  • Кластер Spark в учетную запись хранения Azure
  • Azure Synapse — к учетной записи хранения Azure

Настройка доступа к хранилищу Azure

Azure Databricks и Synapse нуждаются в привилегированном доступе к учетной записи хранения Azure для временного хранения данных.

Azure Synapse не поддерживает использование SAS для доступа к учетной записи хранения. Вы можете настроить доступ для обеих служб, выполнив одно из следующих действий:

  • Используйте ключ и секрет учетной записи для учетной записи хранения и задайте для trueнее значениеforwardSparkAzureStorageCredentials. Сведения о настройке учетных данных Azure для доступа к хранилищу Azure см. в разделе "Настройка свойств Spark".
  • Используйте Azure Data Lake Storage 2-го поколения с проверкой подлинности OAuth 2.0 и задайте для нее trueзначениеenableServicePrincipalAuth. Сведения о настройке подключения из Azure Databricks к Synapse с помощью OAuth 2.0 с субъектом-службой.
  • Настройте экземпляр Azure Synapse, чтобы иметь управляемое удостоверение службы и задать для trueнего значениеuseAzureMSI.

Обязательные разрешения Azure Synapse

Так как он используется COPY в фоновом режиме, соединитель Azure Synapse требует, чтобы пользователь подключения JDBC был иметь разрешение на выполнение следующих команд в подключенном экземпляре Azure Synapse:

Если целевая таблица не существует в Azure Synapse, в дополнение к приведенной выше команде необходимо разрешение на выполнение следующей команды:

В следующей таблице приведены сведения о разрешениях, необходимых для записи:COPY

Разрешения (вставка в существующую таблицу) Разрешения (вставка в новую таблицу)
ADMINISTER DATABASE BULK OPERATIONS

INSERT
ADMINISTER DATABASE BULK OPERATIONS

INSERT

CREATE TABLE

ALTER ON SCHEMA :: dbo

Конфигурации сети

Если вы настроите брандмауэр в Azure Synapse, необходимо настроить параметры сети, чтобы разрешить Azure Databricks достичь Azure Synapse. Сначала убедитесь, что рабочая область Azure Databricks развернута в собственной виртуальной сети после развертывания Azure Databricks в виртуальной сети Azure (внедрение виртуальной сети). Затем можно настроить правила брандмауэра IP-адресов в Azure Synpase, чтобы разрешить подключения из подсетей к учетной записи Synapse. См . правила брандмауэра IP-адресов Azure Synapse Analytics.

Настройка подключения из Azure Databricks к Synapse с помощью OAuth 2.0 с субъектом-службой

Вы можете проходить проверку подлинности в Azure Synapse Analytics с помощью субъекта-службы с доступом к базовой учетной записи хранения. Дополнительные сведения об использовании учетных данных субъекта-службы для доступа к учетной записи хранения Azure см. в разделе Доступ к Azure Data Lake Storage 2-го поколения и Хранилищу BLOB-объектов с помощью Azure Databricks. Чтобы включить проверку подлинности соединителя с помощью субъекта-службы, необходимо задать enableServicePrincipalAuth параметр true в конфигурации подключения Azure Databricks Synapse .

При необходимости для подключения к Azure Synapse Analytics можно использовать другой субъект-службу. В следующем примере настраивается учетные данные субъекта-службы для учетной записи хранения и необязательные учетные данные субъекта-службы для Synapse:

ini

; Defining the Service Principal credentials for the Azure storage account
fs.azure.account.auth.type OAuth
fs.azure.account.oauth.provider.type org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
fs.azure.account.oauth2.client.id <application-id>
fs.azure.account.oauth2.client.secret <service-credential>
fs.azure.account.oauth2.client.endpoint https://login.microsoftonline.com/<directory-id>/oauth2/token

; Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.databricks.sqldw.jdbc.service.principal.client.id <application-id>
spark.databricks.sqldw.jdbc.service.principal.client.secret <service-credential>

Scala

// Defining the Service Principal credentials for the Azure storage account
spark.conf.set("fs.azure.account.auth.type", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret", "<service-credential>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

// Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")

Python

# Defining the service principal credentials for the Azure storage account
spark.conf.set("fs.azure.account.auth.type", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret", "<service-credential>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

# Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")

R

# Load SparkR
library(SparkR)
conf <- sparkR.callJMethod(sparkR.session(), "conf")

# Defining the service principal credentials for the Azure storage account
sparkR.callJMethod(conf, "set", "fs.azure.account.auth.type", "OAuth")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.id", "<application-id>")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.secret", "<service-credential>")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

# Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")

Поддерживаемые режимы сохранения для пакетной записи

Соединитель Azure Synapse поддерживает режимы сохранения ErrorIfExists, Ignore, Append и Overwrite, по умолчанию используя режим ErrorIfExists. Дополнительные сведения о поддерживаемых режимах сохранения в Apache Spark см. в статье документация Spark SQL по режимам сохранения.

Справочник по параметрам соединителя Azure Databricks Synapse

Предоставленные OPTIONS в Spark SQL поддерживают следующие параметры:

Параметр Обязательное поле По умолчанию. Примечания.
dbTable Да, если не указан параметр query Нет по умолчанию Таблица для создания или чтения данных из Azure Synapse. Этот параметр является обязательным при сохранении (записи) данных обратно в Azure Synapse.

Для доступа к таблице в определенной схеме также можно использовать {SCHEMA NAME}.{TABLE NAME}. Если имя схемы не указано, используется схема по умолчанию, связанная с пользователем JDBC.

Ранее поддерживавшийся вариант dbtable является нерекомендуемым и в будущих выпусках будет игнорироваться. Вместо этого указывайте имя слитно с первой буквой в нижнем регистре (т. н. camel case).
query Да, если не указан параметр dbTable Нет по умолчанию Запрос для чтения данных в Azure Synapse.

Для доступа к таблицам в определенной схеме, упоминаемым в запросе, также можно использовать {SCHEMA NAME}.{TABLE NAME}. Если имя схемы не указано, используется схема по умолчанию, связанная с пользователем JDBC.
user No Нет по умолчанию Имя пользователя Azure Synapse. Используется в сочетании с параметром password. Можно использовать только в том случае, если имя пользователя и пароль не передаются в URL-адресе. Если эти данные передаются обоими способами, возникнет ошибка.
password No Нет по умолчанию Пароль Azure Synapse. Используется в сочетании с параметром user. Можно использовать только в том случае, если имя пользователя и пароль не передаются в URL-адресе. Если эти данные передаются обоими способами, возникнет ошибка.
url Да Нет по умолчанию URL-адрес JDBC, где в качестве подпротокола указан sqlserver. Рекомендуется использовать строку подключения с портала Azure. Параметр
Настоятельно рекомендуется использовать параметр encrypt=true, так как при этом включается SSL-шифрование подключения JDBC. Если параметры user и password заданы отдельно, их не нужно включать в URL-адрес.
jdbcDriver No Определяется подпротоколом URL-адреса JDBC. Имя класса используемого драйвера JDBC. Этот класс должен находиться в подкаталоге классов. В большинстве случаев указывать этот параметр нет необходимости, так как имя класса соответствующего драйвера должно автоматически определяться подпротоколом в URL-адресе JDBC.

Ранее поддерживавшийся вариант jdbc_driver является нерекомендуемым и в будущих выпусках будет игнорироваться. Вместо этого указывайте имя слитно с первой буквой в нижнем регистре (т. н. camel case).
tempDir Да Нет по умолчанию Универсальный код ресурса (URI) abfss. Мы рекомендуем использовать для Azure Synapse выделенный контейнер хранилища BLOB-объектов.

Ранее поддерживавшийся вариант tempdir является нерекомендуемым и в будущих выпусках будет игнорироваться. Вместо этого указывайте имя слитно с первой буквой в нижнем регистре (т. н. camel case).

Нельзя использовать внешнее расположение, определенное в каталоге tempDir Unity в качестве расположения.
tempCompression No SNAPPY Алгоритм сжатия, используемый для кодирования и декодирования временных файлов как в Spark, так и в Azure Synapse. В настоящее время поддерживаются значения UNCOMPRESSED, SNAPPY и GZIP.
forwardSparkAzureStorageCredentials No false Если trueбиблиотека автоматически обнаруживает учетные данные ключа доступа учетной записи хранения, которые Spark использует для подключения к контейнеру хранилища BLOB-объектов и перенаправлять эти учетные данные в Azure Synapse через JDBC. Эти учетные данные отправляются в запросе JDBC. Поэтому при использовании этого параметра настоятельно рекомендуется включить для подключения JDBC шифрование SSL.

При настройке проверки подлинности хранилища необходимо задать точно одно из useAzureMSI них и forwardSparkAzureStorageCredentials значение true. Кроме того, можно задать enableServicePrincipalAuth true и использовать субъект-службу для проверки подлинности JDBC и хранилища. Этот forwardSparkAzureStorageCredentials параметр не поддерживает проверку подлинности в хранилище с помощью управляемого удостоверения службы или субъекта-службы. Поддерживается только ключ доступа к учетной записи хранения.

Ранее поддерживавшийся вариант forward_spark_azure_storage_credentials является нерекомендуемым и в будущих выпусках будет игнорироваться. Вместо этого указывайте имя слитно с первой буквой в нижнем регистре (т. н. camel case).
useAzureMSI No false Если задано значение true, библиотека для создаваемых ею учетных данных с областью базы данных будет указывать IDENTITY = 'Managed Service Identity' без SECRET.

При настройке проверки подлинности хранилища необходимо задать точно одно из useAzureMSI них и forwardSparkAzureStorageCredentials значение true. Кроме того, можно задать enableServicePrincipalAuth true и использовать субъект-службу для проверки подлинности JDBC и хранилища.
enableServicePrincipalAuth No false Если задано значение true, библиотека будет использовать предоставленные учетные данные субъекта-службы для подключения к учетной записи хранения Azure и Azure Synapse Analytics через JDBC.

forward_spark_azure_storage_credentials Если задано значение или useAzureMSI имеет trueзначение, этот параметр будет иметь приоритет над субъектом-службой в проверке подлинности хранилища.
tableOptions No CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN Строка, используемая для указания параметров таблицы при создании таблицы Azure Synapse, заданной с помощью dbTable. Эта строка передается в качестве литерала в предложении WITH инструкции SQL CREATE TABLE, которая направляется в Azure Synapse.

Ранее поддерживавшийся вариант table_options является нерекомендуемым и в будущих выпусках будет игнорироваться. Вместо этого указывайте имя слитно с первой буквой в нижнем регистре (т. н. camel case).
preActions No Без значения по умолчанию (пустая строка) Разделенный символом ; список команд SQL, которые должны быть выполнены в Azure Synapse перед записью данных в экземпляр Azure Synapse. Эти команды SQL должны быть допустимыми командами, которые принимает Azure Synapse.

Если какая-либо из этих команд завершается ошибкой, она обрабатывается как ошибка, а операция записи не выполняется.
postActions No Без значения по умолчанию (пустая строка) Разделенный символом ; список команд SQL, которые должны быть выполнены в Azure Synapse после того, как соединитель успешно запишет данные в экземпляр Azure Synapse. Эти команды SQL должны быть допустимыми командами, которые принимает Azure Synapse.

Если какая-либо из этих команд завершается ошибкой, она обрабатывается как ошибка, и после успешной записи данных в экземпляр Azure Synapse возникает исключение.
maxStrLength No 256 StringType в Spark сопоставляется с типом NVARCHAR(maxStrLength) в Azure Synapse. С помощью maxStrLength можно задать длину строки для всех столбцов типа NVARCHAR(maxStrLength), которые находятся в таблице с именем
dbTable в Azure Synapse.

Ранее поддерживавшийся вариант maxstrlength является нерекомендуемым и в будущих выпусках будет игнорироваться. Вместо этого указывайте имя слитно с первой буквой в нижнем регистре (т. н. camel case).
applicationName No Databricks-User-Query Тег соединения для каждого запроса. Если значение не указано или является пустой строкой, в значение тега по умолчанию добавляется URL-адрес JDBC. Значение по умолчанию не позволяет средству мониторинга Azure DB инициировать ложные предупреждения об атаках путем внедрении кода SQL.
maxbinlength No Нет по умолчанию Управление длиной для столбцов BinaryType. Этот параметр преобразуется в VARBINARY(maxbinlength).
identityInsert No false Если задано значение true, активируется режим IDENTITY_INSERT, в результате чего указанное в DataFrame значение вставляется в столбец IDENTITY таблицы Azure Synapse.

См. раздел Вставка значений в столбец IDENTITY явным образом.
externalDataSource No Нет по умолчанию Предварительно подготовленный внешний источник данных для чтения данных из Azure Synapse. Внешний источник данных можно использовать только с PolyBase и удаляет требование разрешения CONTROL, так как соединитель не должен создавать учетные данные с областью действия и внешний источник данных для загрузки данных.

Пример использования и список разрешений, необходимых при использовании внешнего источника данных, см. в разделе Необходимые разрешения Azure Synapse для PolyBase с внешним источником данных.
maxErrors No 0 Максимальное количество строк, которые могут быть отклонены во время операций чтения и записи перед отменой операции загрузки. Отклоненные строки будут игнорироваться. Например, если в двух из десяти записей есть ошибки, обрабатываются только восемь записей.

Дополнительные сведения см. в документации по REJECT_VALUE в CREATE EXTERNAL TABLE и MAXERRORS в COPY.
inferTimestampNTZType No false Если trueзначения типа Azure Synapse TIMESTAMP интерпретируются как TimestampNTZType (метка времени без часового пояса) во время чтения. В противном случае все метки времени интерпретируются независимо TimestampType от типа в базовой таблице Azure Synapse.

Примечание.

  • Параметры tableOptions, preActions, postActions и maxStrLength нужны только при записи данных из Azure Databricks в новую таблицу в Azure Synapse.
  • Хотя все имена параметров источника данных нечувствительны к регистру, для ясности рекомендуется указывать их слитно с первой буквой в нижнем регистре (т. н. camel case).

pushdown запроса в Azure Synapse

Соединитель Azure Synapse реализует набор правил оптимизации для отправки указанных ниже операторов в Azure Synapse.

  • Filter
  • Project
  • Limit

Операторы Project и Filter поддерживают следующие выражения:

  • Большинство булевых логических операторов
  • Сравнения
  • Простые арифметические операции
  • Приведение числовых или строковых типов

Для оператора Limit pushdown поддерживается только в том случае, если порядок не указан. Например:

SELECT TOP(10) * FROM table, но не SELECT TOP(10) * FROM table ORDER BY col.

Примечание.

Соединитель Azure Synapse не передает выражения, работающие со строками, датами или отметками времени.

Передача pushdown запросов, созданных с помощью соединителя Azure Synapse, по умолчанию включена. Ее можно отключить, задав для параметра spark.databricks.sqldw.pushdown значение false.

Управление временными данными

Соединитель Azure Synapse не удаляет временные файлы, создаваемые в контейнере хранилища Azure. Databricks рекомендует периодически удалять временные файлы в указанном tempDir пользователем расположении.

Чтобы упростить очистку данных, соединитель Azure Synapse не сохраняет файлы данных непосредственно в tempDir, а создает подкаталог вида <tempDir>/<yyyy-MM-dd>/<HH-mm-ss-SSS>/<randomUUID>/. Вы можете настроить периодические задания (с помощью функции заданий Azure Databricks или иным способом) для рекурсивного удаления всех подкаталогов, которые старше заданного порогового значения (например, 2 дней), в предположении, что задания Spark не могут выполняться дольше этого порогового значения.

Более простая альтернатива — периодическое удаление всего контейнера и создание нового с тем же именем. Для этого необходимо использовать выделенный контейнер для временных данных, создаваемых соединителем Azure Synapse, и найти интервал времени, в течение которого запросы с участием соединителя гарантированно не будут выполняться.

Управление временными объектами

Соединитель Azure Synapse автоматизирует обмен данными между кластером Azure Databricks и экземпляром Azure Synapse. Для чтения данных из таблицы или запроса Azure Synapse или записи данных в таблицу Azure Synapse соединитель Azure Synapse в фоновом режиме создает временные объекты, включая DATABASE SCOPED CREDENTIAL, EXTERNAL DATA SOURCE, EXTERNAL FILE FORMAT и EXTERNAL TABLE. Эти объекты живут только в течение соответствующего задания Spark и автоматически удаляются.

Если в кластере выполняется запрос с использованием соединителя Azure Synapse, то в случае, если процесс драйвера Spark завершается сбоем или принудительно перезапускается либо кластер принудительно завершается или перезапускается, временные объекты могут быть не удалены. Чтобы эти объекты было удобно идентифицировать и удалять вручную, соединитель Azure Synapse добавляет в начало имен всех промежуточных временных объектов, создаваемых в экземпляре Azure Synapse, тег в таком формате: tmp_databricks_<yyyy_MM_dd_HH_mm_ss_SSS>_<randomUUID>_<internalObject>.

Рекомендуется периодически выполнять поиск оставшихся объектов с помощью следующих запросов:

  • SELECT * FROM sys.database_scoped_credentials WHERE name LIKE 'tmp_databricks_%'
  • SELECT * FROM sys.external_data_sources WHERE name LIKE 'tmp_databricks_%'
  • SELECT * FROM sys.external_file_formats WHERE name LIKE 'tmp_databricks_%'
  • SELECT * FROM sys.external_tables WHERE name LIKE 'tmp_databricks_%'