Azure Synapse Analyticsのデータへのクエリー

Azure Synapse の COPY ステートメントを使用して、一時的なステージング用の Azure Data Lake Storage Gen2 ストレージ アカウントを使用して、Databricks クラスターと Azure Synapse インスタンスの間で大量のデータを効率的に転送する Azure Synapse コネクタを使用して Databricks から Azure Synapse にアクセスできます。

実験段階

この記事で説明する構成は 実験的です。 実験的な機能は現状のまま提供され、Databricks による顧客テクニカル サポートを通じてサポートされることはありません。 完全なクエリ フェデレーション サポートを取得するには、代わりにレイクハウス フェデレーションを使用する必要があります。これにより、 DatabricksユーザーはUnity Catalog構文とデータガバナンス ツールを活用できるようになります。

Azure Synapse Analytics は、超並列処理 (MPP) を利用して、ペタバイト規模のデータに対して複雑なクエリーをすばやく実行するクラウドベースのエンタープライズ データ ウェアハウスです。

重要

このコネクタは、Synapse 専用プール インスタンスでのみ使用し、他の Synapse コンポーネントとは互換性がありません。

注:

COPY は、Azure Data Lake Storage Gen2 インスタンスでのみ使用できます。 Polybase の操作の詳細については、「 Databricks と Azure Synapse を PolyBase に接続する (レガシー)」を参照してください。

Synapseの構文例

Synapse は、Scala、Python、SQL、R でクエリーできます。次のコード例では、ストレージ アカウント キーを使用して、ストレージ資格情報を Databricks から Synapse に転送します。

注:

JDBC 接続を介して Spark ドライバーと Azure Synapse インスタンスの間で送信されるすべてのデータに対して Secure Sockets Layer (SSL) 暗号化を有効にする、Azure portal によって提供される接続文字列を使用します。 SSL 暗号化が有効になっていることを確認するには、接続文字列で encrypt=true を検索します。

重要

Unity Catalog で定義されている外部ロケーション は、 tempDir の場所としてサポートされていません。

// 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()

# 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()
-- 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;
# 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>")

DatabricksとSynapse間の認証はどのように機能するか

Azure Synapse コネクタでは、次の 3 種類のネットワーク接続が使用されます。

  • Spark ドライバーから Azure Synapse へ

  • Spark クラスターから Azure ストレージ アカウントへ

  • Azure Synapse から Azure ストレージ アカウントへ

Azure Storageへのアクセスの構成

Databricks と Synapse の両方に、一時的なデータ ストレージに使用する Azure ストレージ アカウントへの特権アクセスが必要です。

Azure Synapse では、ストレージ アカウントへのアクセスに SAS を使用することはサポートされていません。 両方のサービスのアクセスを構成するには、次のいずれかの操作を行います。

必要な Azure Synapse アクセス許可

Azure Synapse コネクタはバックグラウンドで COPY を使用するため、JDBC 接続ユーザーには、接続された Azure Synapse インスタンスで次のコマンドを実行するためのアクセス許可が必要です。

変換先テーブルが Azure Synapse に存在しない場合は、上記のコマンドに加えて、次のコマンドを実行するためのアクセス許可が必要です。

次の表は、 COPYを使用した書き込みに必要なアクセス許可をまとめたものです。

アクセス許可 (既存のテーブルへの挿入)

アクセス許可 (新しいテーブルへの挿入)

データベースの一括操作を管理する

INSERT

データベースの一括操作を管理する

INSERT

CREATE TABLE

ALTER ON SCHEMA :: dbo

サービスプリンシパルを使用して OAuth 2.0 を使用して Databricks から Synapse への接続を構成する

Azure Synapse Analytics に対する認証は、基になるストレージ アカウントへのアクセス権を持つサービス プリンシパルを使用して行うことができます。 サービスプリンシパルの資格情報を使用して Azure ストレージ アカウントにアクセスする方法の詳細については、「 Azure Data Lake Storage Gen2 と Blob Storage に接続する」を参照してください。 コネクタがサービスプリンシパルで認証できるようにするには、接続構成の Databricks Synapse コネクタ オプション リファレンスenableServicePrincipalAuth オプションを true に設定する必要があります。

必要に応じて、Azure Synapse Analytics 接続に別のサービス プリンシパルを使用できます。 次の例では、ストレージ アカウントのサービス プリンシパル資格情報と、Synapse のオプションのサービス プリンシパル資格情報を構成します。

; 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>
// 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>")
# 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>")
# 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 コネクタでは、 ErrorIfExistsIgnoreAppendOverwrite の保存モードがサポートされており、デフォルト モードは ErrorIfExistsです。 Apache Spark でサポートされている保存モードの詳細については、 保存モードに関する Spark SQL のドキュメントを参照してください。

Databricks Synapse コネクタ オプションのリファレンス

Spark SQL で提供される OPTIONS では、次の設定がサポートされています。

パラメーター

*必須

デフォルト

dbTable

はい ( query が指定されていない場合)

デフォルトなし

Azure Synapse で作成または読み取りを行うテーブル。 このパラメーターは、データを Azure Synapse に保存し直すときに必要です。

また、 {SCHEMA NAME}.{TABLE NAME} を使用して、特定のスキーマ内のテーブルにアクセスすることもできます。 スキーマ名を指定しない場合は、JDBC ユーザーに関連付けられたデフォルトのスキーマが使用されます。

以前にサポートされていた dbtable バリアントは非推奨であり、将来のリリースでは無視されます。 代わりに「キャメルケース」という名前を使用してください。

query

はい ( dbTable が指定されていない場合)

デフォルトなし

Azure Synapse で読み取るクエリー。

クエリーで参照されるテーブルの場合、 {SCHEMA NAME}.{TABLE NAME} を使用して特定のスキーマ内のテーブルにアクセスすることもできます。 スキーマ名を指定しない場合は、JDBC ユーザーに関連付けられたデフォルトのスキーマが使用されます。

user

なし

デフォルトなし

Azure Synapse ユーザー名。 passwordオプションと組み合わせて使用する必要があります。ユーザーとパスワードが URL で渡されない場合にのみ使用できます。 両方を渡すとエラーになります。

password

なし

デフォルトなし

Azure Synapse のパスワード。 userオプションと組み合わせて使用する必要があります。ユーザーとパスワードが URL で渡されない場合にのみ使用できます。 両方を渡すとエラーになります。

url

あり

デフォルトなし

サブプロトコルとして sqlserver が設定されたJDBC URL。 Azure portal によって提供される接続文字列を使用することをお勧めします。 encrypt=trueを設定すると、JDBC接続のSSL暗号化が有効になるため、強くお勧めします。userpasswordが別々に設定されている場合は、URL に含める必要はありません。

jdbcDriver

なし

JDBC URL のサブプロトコルによって決定される

使用するJDBCドライバのクラス名。 このクラスはクラスパス上に存在する必要があります。 ほとんどの場合、適切なドライバ・クラス名はJDBC URLのサブプロトコルによって自動的に決定されるため、このオプションを指定する必要はありません。

以前にサポートされていた jdbc_driver バリアントは非推奨であり、将来のリリースでは無視されます。 代わりに「キャメルケース」という名前を使用してください。

tempDir

あり

デフォルトなし

abfss URI。Azure Synapse 専用の Blob Storage コンテナーを使用することをお勧めします。

以前にサポートされていた tempdir バリアントは非推奨であり、将来のリリースでは無視されます。 代わりに「キャメルケース」という名前を使用してください。

Unity Catalog で定義されている外部ロケーションtempDirの場所として使用することはできません。

tempCompression

なし

SNAPPY

Spark と Azure Synapse の両方で一時的なエンコード/デコードに使用される圧縮アルゴリズム。 現在サポートされている値は、 UNCOMPRESSEDSNAPPYGZIPです。

forwardSparkAzureStorageCredentials

なし

trueの場合、ライブラリは、Spark が BLOB ストレージ コンテナーへの接続に使用しているストレージ アカウントのアクセス キー資格情報を自動的に検出し、それらの資格情報を JDBC 経由で Azure Synapse に転送します。 これらの資格情報は、JDBC クエリの一部として送信されます。 したがって、このオプションを使用する場合は、JDBC 接続の SSL 暗号化を有効にすることを強くお勧めします。

ストレージ認証を設定する場合は、 useAzureMSIforwardSparkAzureStorageCredentials のいずれか 1 つだけを trueに設定する必要があります。 あるいは、 enableServicePrincipalAuth trueに設定し、JDBC 認証とストレージ認証の両方にサービスプリンシパルを使用することもできます。 forwardSparkAzureStorageCredentialsオプションは、マネージドサービス ID またはサービスプリンシパルのいずれかを使用したストレージへの認証をサポートしていません。 ストレージ アカウント アクセス キーのみがサポートされます。

以前にサポートされていた forward_spark_azure_storage_credentials バリアントは非推奨であり、将来のリリースでは無視されます。 代わりに「キャメルケース」という名前を使用してください。

useAzureMSI

なし

trueの場合、ライブラリは、作成するデータベース スコープの資格情報にIDENTITY = 'Managed Service Identity'を指定し、SECRETを指定しません。

ストレージ認証を設定する場合は、 useAzureMSIforwardSparkAzureStorageCredentials のいずれか 1 つだけを trueに設定する必要があります。 または、 enableServicePrincipalAuthtrue に設定し、JDBC 認証とストレージ認証の両方にサービスプリンシパルを使用することもできます。

enableServicePrincipalAuth

なし

true場合、ライブラリは指定されたサービス プリンシパルの資格情報を使用して、JDBC 経由で Azure ストレージ アカウントと Azure Synapse Analytics に接続します。

forward_spark_azure_storage_credentials または useAzureMSItrueに設定されている場合、ストレージ認証では、そのオプションがサービスプリンシパルよりも優先されます。

tableOptions

なし

CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN

dbTableを使用して Azure Synapse テーブル セットを作成するときにテーブル オプションを指定するために使用される文字列。この文字列は、Azure Synapse に対して発行される CREATE TABLE SQL ステートメントの WITH 句に文字どおりに渡されます。

以前にサポートされていた table_options バリアントは非推奨であり、将来のリリースでは無視されます。 代わりに「キャメルケース」という名前を使用してください。

preActions

なし

デフォルトなし(空の文字列)

Azure Synapse インスタンスにデータを書き込む前に Azure Synapse で実行される SQL コマンドの ; 区切りリスト。 これらの SQL コマンドは、Azure Synapse によって受け入れられる有効なコマンドである必要があります。

これらのコマンドのいずれかが失敗すると、エラーとして扱われ、書き込み操作は実行されません。

postActions

なし

デフォルトなし(空の文字列)

コネクタが Azure Synapse インスタンスにデータを正常に書き込んだ後に Azure Synapse で実行される SQL コマンドの ; 区切りリスト。 これらの SQL コマンドは、Azure Synapse によって受け入れられる有効なコマンドである必要があります。

これらのコマンドのいずれかが失敗した場合、エラーとして扱われ、データが Azure Synapse インスタンスに正常に書き込まれた後に例外が発生します。

maxStrLength

なし

256

StringType Spark は、Azure Synapse の NVARCHAR(maxStrLength) 型にマップされます。 maxStrLength を使用して、Azure Synapse で名前が dbTable のテーブルにあるすべてのNVARCHAR(maxStrLength)型の列の文字列の長さを設定できます。

以前にサポートされていた maxstrlength バリアントは非推奨であり、将来のリリースでは無視されます。 代わりに「キャメルケース」という名前を使用してください。

applicationName

なし

Databricks-User-Query

各クエリーの接続のタグ。 指定しない場合、または値が空の文字列の場合、タグのデフォルト値がJDBC URLに追加されます。 既定値は、Azure DB モニタリング ツールがクエリーに対して偽の SQL インジェクション アラートを生成するのを防ぎます。

maxbinlength

なし

デフォルトなし

BinaryType列の列の長さを制御します。このパラメーターは VARBINARY(maxbinlength)と変換されます。

identityInsert

なし

true に設定すると、IDENTITY_INSERT モードが有効になり、Azure Synapse テーブルの ID 列に DataFrame で提供された値が挿入されます。

IDENTITY 列への値の明示的な挿入を参照してください。

externalDataSource

なし

デフォルトなし

Azure Synapse からデータを読み取るために事前にプロビジョニングされた外部データ ソース。 外部データ ソースは PolyBase でのみ使用でき、コネクタはデータを読み込むためにスコープ付き資格情報と外部データソースを作成する必要がないため、CONTROL アクセス許可の要件がなくなります。

使用方法と、外部データソースを使用するときに必要なアクセス許可の一覧については、「 外部データ ソース オプションを使用した PolyBase に必要な Azure Synapse アクセス許可」を参照してください。

maxErrors

なし

0

読み込み操作が取り消される前に、読み取りおよび書き込み中に拒否できる行の最大数。 リジェクトされた行は無視されます。 たとえば、10 個のレコードのうち 2 個にエラーがある場合、8 個のレコードのみが処理されます。

CREATE EXTERNAL TABLE のREJECT_VALUEドキュメントと COPY の MAXERRORS のドキュメントを参照してください。

inferTimestampNTZType

なし

trueの場合、Azure Synapse TIMESTAMP 型の値は、読み取り時に TimestampNTZType (タイム ゾーンなしのタイムスタンプ) として解釈されます。それ以外の場合、基になる Azure Synapse テーブルの種類に関係なく、すべてのタイムスタンプが TimestampType として解釈されます。

注:

  • tableOptionspreActionspostActionsmaxStrLength は、Databricks から Azure Synapse の新しいテーブルにデータを書き込む場合にのみ関連します。

  • すべてのデータソースオプション名では大文字と小文字が区別されませんが、わかりやすくするために「キャメルケース」で指定することをお勧めします。

Azure Synapseへのクエリープッシュダウン

Azure Synapse コネクタは、次の演算子を Azure Synapse にプッシュダウンするための一連の最適化ルールを実装します。

  • Filter

  • Project

  • Limit

Project 演算子と Filter 演算子は、次の式をサポートしています。

  • ほとんどの Boolean 論理演算子

  • 比較

  • 基本的な算術演算

  • 数値キャストと文字列キャスト

Limit演算子の場合、プッシュダウンは順序が指定されていない場合にのみサポートされます。例えば:

SELECT TOP(10) * FROM tableですが、 SELECT TOP(10) * FROM table ORDER BY colではありません。

注:

Azure Synapse コネクタでは、文字列、日付、またはタイムスタンプを操作する式はプッシュダウンされません。

Azure Synapse コネクタでビルドされたクエリー プッシュダウンは、デフォルトで有効になります。 無効にするには、 spark.databricks.sqldw.pushdownfalseに設定します。

Temporary データマネジメント

Azure Synapse コネクタ では、 Azure ストレージ コンテナーに作成された一時ファイルは削除されません。 Databricks では、ユーザーが指定した tempDir の場所にある一時ファイルを定期的に削除することをお勧めします。

To facilitate data cleanup, the Azure Synapse connector does not store data files directly under tempDir, but instead creates a subdirectory of the form: <tempDir>/<yyyy-MM-dd>/<HH-mm-ss-SSS>/<randomUUID>/. You can set up periodic jobs (using the Databricks jobs feature or otherwise) to recursively delete any subdirectories that are older than a given threshold (for example, 2 days), with the assumption that there cannot be Spark jobs running longer than that threshold.

より簡単な方法は、コンテナ全体を定期的に削除し、同じ名前で新しいコンテナを作成することです。 そのためには、Azure Synapse コネクターによって生成される一時データに専用のコンテナーを使用し、コネクターが関与するクエリーが実行されていないことを保証できる時間枠を見つける必要があります。

一時オブジェクトの管理

Azure Synapse コネクタは、Databricks クラスターと Azure Synapse インスタンス間のデータ転送を自動化します。 Azure Synapse テーブルまたはクエリーからデータを読み取ったり、Azure Synapse テーブルにデータを書き込んだりするために、Azure Synapse コネクタは、 DATABASE SCOPED CREDENTIALEXTERNAL DATA SOURCEEXTERNAL FILE FORMATEXTERNAL 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_%'