Bagikan melalui


Menghubungkan Azure Databricks dan Azure Synapse dengan PolyBase (warisan)

Penting

Dokumentasi ini telah dihentikan dan mungkin tidak diperbarui. Produk, layanan, atau teknologi yang disebutkan dalam konten ini tidak lagi didukung. Lihat Mengkueri data di Azure Synapse Analytics.

Databricks merekomendasikan penggunaan fungsionalitas default COPY dengan Azure Data Lake Storage Gen2 untuk koneksi ke Azure Synapse. Artikel ini mencakup dokumentasi warisan sekeliling PolyBase dan penyimpanan blob.

Azure Synapse Analytics (sebelumnya SQL Data Warehouse) adalah gudang data korporasi berbasis cloud yang memanfaatkan pemrosesan paralel besar-besaran (MPP) untuk menjalankan kueri kompleks dengan cepat melintasi petabyte data. Gunakan Azure sebagai komponen kunci dari solusi data besar. Impor data besar ke dalam Azure dengan kueri T-SQL PolyBase sederhana, atau pernyataan COPY lalu gunakan kekuatan MPP untuk menjalankan analitik berkinerja tinggi. Saat Anda mengintegrasikan dan menganalisis, gudang data akan menjadi versi kebenaran tunggal yang dapat Anda andalkan untuk wawasan.

Anda dapat mengakses Azure Synapse dari Azure Databricks menggunakan konektor Azure Synapse, implementasi sumber data untuk Apache Spark yang menggunakan penyimpanan Azure Blob, dan PolyBase atau pernyataan COPY di Azure Synapse untuk mentransfer data dalam jumlah besar secara efisien antara kluster Azure Databricks dan instans Azure Synapse.

Kluster Azure Databricks maupun instans Azure Synapse mengakses kontainer penyimpanan Blob umum untuk bertukar data di antara kedua sistem ini. Di Azure Databricks, pekerjaan Apache Spark dipicu oleh konektor Azure Synapse untuk membaca data dari dan menulis data ke kontainer penyimpanan Blob. Pada sisi Azure Synapse, operasi pemuatan dan pembongkaran data yang dilakukan oleh PolyBase dipicu oleh konektor Azure Synapse melalui JDBC. Di Databricks Runtime 7.0 ke atas, COPY digunakan secara default untuk memuat data ke dalam Azure Synapse oleh konektor Azure Synapse melalui JDBC.

Catatan

COPY hanya tersedia pada instans Azure Synapse Gen2, yang menyediakan performa yang lebih baik. Jika database Anda masih menggunakan instans Gen1, sebaiknya Anda memigrasikan database ke Gen2.

Konektor Azure Synapse lebih cocok untuk ETL daripada kueri interaktif, karena setiap eksekusi kueri dapat mengekstrak jumlah data yang besar ke penyimpanan Blob. Jika Anda berencana untuk melakukan beberapa kueri terhadap tabel Azure Synapse yang sama, sebaiknya Anda menyimpan data yang diekstrak dalam format seperti Parquet.

Persyaratan

Kunci master database Azure Synapse.

Autentikasi

Konektor Azure Synapse menggunakan tiga jenis sambungan jaringan:

  • Driver Spark ke Azure Synapse
  • Driver dan eksekutor Spark ke akun penyimpanan Azure
  • Azure Synapse ke akun penyimpanan Azure
                                 ┌─────────┐
      ┌─────────────────────────>│ STORAGE │<────────────────────────┐
      │   Storage acc key /      │ ACCOUNT │  Storage acc key /      │
      │   Managed Service ID /   └─────────┘  OAuth 2.0 /            │
      │                               │                              │
      │                               │                              │
      │                               │ Storage acc key /            │
      │                               │ OAuth 2.0 /                  │
      │                               │                              │
      v                               v                       ┌──────v────┐
┌──────────┐                      ┌──────────┐                │┌──────────┴┐
│ Synapse  │                      │  Spark   │                ││ Spark     │
│ Analytics│<────────────────────>│  Driver  │<───────────────>│ Executors │
└──────────┘  JDBC with           └──────────┘    Configured   └───────────┘
              username & password /                in Spark

Bagian berikut menjelaskan opsi konfigurasi autentikasi setiap sambungan.

Driver Spark ke Azure Synapse

Driver Spark dapat tersambung ke Azure Synapse menggunakan JDBC dengan nama pengguna dan kata sandi atau OAuth 2.0 dengan perwakilan layanan untuk autentikasi.

Nama pengguna dan kata sandi

Sebaiknya Anda menggunakan string koneksi yang disediakan oleh portal Azure untuk kedua jenis autentikasi, yang memungkinkan enkripsi Secure Sockets Layer (SSL) untuk semua data dikirimkan antara driver Spark dan instans Azure Synapse melalui sambungan JDBC. Untuk memverifikasi bahwa enkripsi SSL diaktifkan, Anda dapat mencari encrypt=true dalam string koneksi.

Untuk mengizinkan driver Spark mencapai Azure Synapse, kami sarankan Anda mengatur Izinkan layanan dan sumber daya Azure untuk mengakses ruang kerja ini ke AKTIF di panel Jaringan di bawah Keamanan ruang kerja Azure Synapse melalui portal Azure. Pengaturan ini memungkinkan komunikasi dari semua alamat IP Azure dan semua subnet Azure, yang memungkinkan driver Spark mencapai instans Azure Synapse.

OAuth 2.0 dengan perwakilan layanan

Anda dapat mengautentikasi ke Azure Synapse Analytics menggunakan perwakilan layanan dengan akses ke akun penyimpanan yang mendasarinya. Untuk informasi selengkapnya tentang menggunakan kredensial perwakilan layanan untuk mengakses akun penyimpanan Azure, lihat Menyambungkan ke Azure Data Lake Storage Gen2 dan Blob Storage. Anda harus mengatur opsi enableServicePrincipalAuth ke true di Parameter konfigurasi sambungan untuk memungkinkan konektor mengautentikasi dengan perwakilan layanan.

Anda dapat secara opsional menggunakan berbagai perwakilan layanan untuk sambungan Azure Synapse Analytics. Contoh yang mengonfigurasi kredensial perwakilan layanan untuk akun penyimpanan dan kredensial perwakilan layanan opsional untuk 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>")

Driver dan eksekutor Spark ke akun penyimpanan Azure

Kontainer penyimpanan Azure bertindak sebagai perantara untuk menyimpan data massal saat membaca dari atau menulis ke Azure Synapse. Spark terhubung ke ADLS Gen2 atau Blob Storage menggunakan driver abfss.

Opsi autentikasi berikut ini tersedia:

Contoh di bawah ini menggambarkan dua cara ini menggunakan pendekatan kunci akses akun penyimpanan. Hal yang sama berlaku untuk konfigurasi OAuth 2.0.

Konfigurasi sesi notebook (lebih dipilih)

Dengan menggunakan pendekatan ini, kunci akses akun diatur dalam konfigurasi sesi yang terkait dengan notebook yang menjalankan perintah. Konfigurasi ini tidak memengaruhi notebook lain yang dilampirkan ke kluster yang sama. spark adalah objek SparkSession yang disediakan di noteboook.

spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

Konfigurasi Hadoop Global

Pendekatan ini memperbarui konfigurasi Hadoop global yang dikaitkan dengan objek SparkContext yang dibagikan oleh semua notebook.

Scala
sc.hadoopConfiguration.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")
Python

hadoopConfiguration tidak dipaparkan di semua versi PySpark. Meskipun perintah berikut bergantung pada beberapa internal Spark, ia seharusnya berfungsi untuk semua versi PySpark dan tidak mungkin putus atau berubah di masa depan:

sc._jsc.hadoopConfiguration().set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

Azure Synapse ke akun penyimpanan Azure

Azure Synapse juga tersambung ke akun penyimpanan selama pemuatan dan pembongkaran data sementara.

Jika Anda sudah menyiapkan kunci dan rahasia akun untuk akun penyimpanan, Anda dapat mengatur forwardSparkAzureStorageCredentials ke true, dalam hal ini konektor Azure Synapse secara otomatis menemukan kunci akses akun yang diatur dalam konfigurasi sesi notebook atau konfigurasi Hadoop global dan meneruskan kunci akses akun penyimpanan ke instans Azure Synapse yang tersambung dengan membuat kredensial tercakup database Azure sementara.

Atau, jika Anda menggunakan ADLS Gen2 dengan autentikasi OAuth 2.0 atau instans Azure Synapse Anda dikonfigurasi untuk memiliki Identitas Layanan Terkelola (biasanya bersama dengan penyiapan VNet + Titik Akhir Layanan), Anda harus mengatur useAzureMSI ke true. Dalam kasus ini konektor akan menentukan IDENTITY = 'Managed Service Identity' bagi kredensial tercakup database dan tidak ada SECRET.

Dukungan streaming

Konektor Azure Synapse menawarkan dukungan tulis Streaming Terstruktur yang efisien dan dapat diskalakan untuk Azure Synapse yang menyediakan pengalaman pengguna yang konsisten dengan penulisan batch, dan menggunakan PolyBase atau COPY untuk transfer data besar antara kluster Azure Databricks dan instans Azure Synapse. Serupa dengan penulisan batch, streaming dirancang terutama untuk ETL, sehingga penyediaan latensi yang lebih tinggi mungkin tidak cocok untuk pemrosesan data waktu nyata dalam beberapa kasus.

Semantik toleransi kegagalan

Secara default, Azure Synapse Streaming menawarkan jaminan sekali sajahulu hingga hilir untuk penulisan data ke dalam tabel Azure Synapse dengan melacak kemajuan kueri dengan andal menggunakan kombinasi lokasi titik pemeriksaan di DBFS, tabel titik pemeriksaan di Azure Synapse, dan mekanisme penguncian untuk memastikan bahwa streaming dapat menghandel semua jenis kegagalan, percobaan ulang, dan pemulaian ulang kueri. Secara opsional, Anda dapat memilih semantik setidaknya sekali yang lebih tidak ketat untuk Azure Synapse Streaming dengan mengatur opsi spark.databricks.sqldw.streaming.exactlyOnce.enabled ke false, dalam hal ini duplikasi data dapat terjadi jika terjadi kegagalan sambungan terputus-putus ke Azure Synapse atau penghentian kueri yang tidak terduga.

Penggunaan (Batch)

Anda dapat menggunakan konektor ini melalui API sumber data di notebook Scala, Python, SQL, dan R.

Scala


// Otherwise, set up the Blob 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.
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


# Otherwise, set up the Blob 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.
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


-- Otherwise, set up the Blob 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.
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)

# Otherwise, set up the Blob 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>")

Penggunaan (Streaming)

Anda dapat menulis data menggunakan Streaming Terstruktur di notebook Scala dan Python.

Scala

// Set up the Blob 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>")

// Prepare streaming source; this could be Kafka or a simple rate stream.
val df: DataFrame = spark.readStream
  .format("rate")
  .option("rowsPerSecond", "100000")
  .option("numPartitions", "16")
  .load()

// Apply some transformations to the data then use
// Structured Streaming API to continuously write the data to a table in Azure Synapse.
df.writeStream
  .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>")
  .option("checkpointLocation", "/tmp_checkpoint_location")
  .start()

Python

# Set up the Blob 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>")

# Prepare streaming source; this could be Kafka or a simple rate stream.
df = spark.readStream \
  .format("rate") \
  .option("rowsPerSecond", "100000") \
  .option("numPartitions", "16") \
  .load()

# Apply some transformations to the data then use
# Structured Streaming API to continuously write the data to a table in Azure Synapse.
df.writeStream \
  .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>") \
  .option("checkpointLocation", "/tmp_checkpoint_location") \
  .start()

Konfigurasi

Bagian ini menjelaskan cara mengonfigurasi semantik tulis untuk konektor, izin yang diperlukan, dan parameter konfigurasi lain-lain.

Di bagian ini:

Mode penyimpanan yang didukung untuk penulisan batch

Konektor Azure Synapse mendukung mode penyimpanan ErrorIfExists, Ignore, Append, dan Overwrite dengan mode defaultnya adalah ErrorIfExists. Untuk informasi selengkapnya tentang mode penyimpanan yang didukung di Apache Spark, lihat Dokumentasi SQL Spark tentang Mode Penyimpanan.

Mode keluaran yang didukung untuk penulisan streaming

Konektor Azure Synapse mendukung mode keluaran Append dan Complete untuk merekam penambahan dan agregasi. Untuk rincian selengkapnya tentang mode keluaran dan matriks kompatibilitas, lihat panduan Streaming Terstruktur.

Semantik tulis

Catatan

COPY tersedia untuk Databricks Runtime 7.0 ke atas.

Selain PolyBase, konektor Azure Synapse mendukung pernyataan COPY. Pernyataan COPY menawarkan cara pemuatan data ke dalam Azure Synapse yang lebih nyaman tanpa perlu membuat tabel eksternal, memerlukan lebih sedikit izin untuk memuat data, dan meningkatkan performa penyerapan data ke dalam Azure Synapse.

Secara default, konektor secara otomatis menemukan semantik tulis terbaik (COPY ketika menargetkan instans Azure Synapse Gen2, PolyBase sebaliknya). Anda juga dapat menentukan semantik tulis dengan konfigurasi berikut:

Scala

// Configure the write semantics for Azure Synapse connector in the notebook session conf.
spark.conf.set("spark.databricks.sqldw.writeSemantics", "<write-semantics>")

Python

# Configure the write semantics for Azure Synapse connector in the notebook session conf.
spark.conf.set("spark.databricks.sqldw.writeSemantics", "<write-semantics>")

SQL

-- Configure the write semantics for Azure Synapse connector in the notebook session conf.
SET spark.databricks.sqldw.writeSemantics=<write-semantics>;

R

# Load SparkR
library(SparkR)

# Configure the write semantics for Azure Synapse connector in the notebook session conf.
conf <- sparkR.callJMethod(sparkR.session(), "conf")
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.writeSemantics", "<write-semantics>")

di mana <write-semantics> adalah polybase yang menggunakan PolyBase, atau copy yang menggunakan pernyataan COPY.

Izin Azure Synapse yang diperlukan untuk PolyBase

Ketika Anda menggunakan PolyBase, konektor Azure Synapse mengharuskan pengguna sambungan JDBC untuk memiliki izin untuk menjalankan perintah berikut dalam instans Azure Synapse yang tersambung:

Sebagai prasyarat untuk perintah pertama, konektor mengharapkan bahwa kunci master database sudah ada untuk instans Azure Synapse yang ditentukan. Jika tidak ada, Anda dapat membuat kunci menggunakan perintah CREATE MASTER KEY.

Selain itu, untuk membaca tabel Azure Synapse yang diatur melalui dbTable atau tabel yang dirujuk di query, pengguna JDBC harus memiliki izin untuk mengakses tabel Azure Synapse yang diperlukan. Untuk menulis data kembali ke tabel Azure Synapse yang diatur melalui dbTable, pengguna JDBC harus memiliki izin untuk menulis ke tabel Azure Synapse ini.

Tabel berikut meringkas izin yang diperlukan untuk semua operasi dengan PolyBase:

Operasi Izin Izin ketika menggunakan sumber data eksternal
Penulisan batch CONTROL Lihat Penulisan batch
Penulisan streaming CONTROL Lihat Penulisan streaming
Read CONTROL Lihat Baca

Izin Azure Synapse yang diperlukan untuk PolyBase dengan opsi sumber data eksternal

Anda dapat menggunakan PolyBase dengan sumber data eksternal yang telah disediakan sebelumnya. Lihat parameter externalDataSource di Parameter untuk informasi selengkapnya.

Untuk menggunakan PolyBase dengan sumber data eksternal yang telah disediakan sebelumnya, konektor Azure Synapse mengharuskan pengguna sambungan JDBC untuk memiliki izin untuk menjalankan perintah berikut dalam instans Azure Synapse yang tersambung:

Untuk membuat sumber data eksternal, Anda harus terlebih dahulu membuat kredensial tercakup database. Tautan berikut menjelaskan cara membuat kredensial tercakup untuk perwakilan layanan dan sumber data eksternal untuk lokasi ABFS:

Catatan

Lokasi sumber data eksternal harus mengarah ke kontainer. Konektor tidak akan berfungsi jika lokasinya adalah direktori dalam kontainer.

Tabel berikut meringkas izin untuk operasi penulisan PolyBase dengan opsi sumber data eksternal:

Operasi Izin (menyisipkan ke dalam tabel yang sudah ada) Izin (menyisipkan ke dalam tabel baru)
Penulisan batch ADMINISTER DATABASE BULK OPERATIONS

INSERT

CREATE TABLE

ALTER ANY SCHEMA

ALTER ANY EXTERNAL DATA SOURCE

ALTER ANY EXTERNAL FILE FORMAT
ADMINISTER DATABASE BULK OPERATIONS

INSERT

CREATE TABLE

ALTER ANY SCHEMA

ALTER ANY EXTERNAL DATA SOURCE

ALTER ANY EXTERNAL FILE FORMAT
Penulisan streaming ADMINISTER DATABASE BULK OPERATIONS

INSERT

CREATE TABLE

ALTER ANY SCHEMA

ALTER ANY EXTERNAL DATA SOURCE

ALTER ANY EXTERNAL FILE FORMAT
ADMINISTER DATABASE BULK OPERATIONS

INSERT

CREATE TABLE

ALTER ANY SCHEMA

ALTER ANY EXTERNAL DATA SOURCE

ALTER ANY EXTERNAL FILE FORMAT

Tabel berikut meringkas izin untuk operasi pembacaan PolyBase dengan opsi sumber data eksternal:

Operasi Izin
Read CREATE TABLE

ALTER ANY SCHEMA

ALTER ANY EXTERNAL DATA SOURCE

ALTER ANY EXTERNAL FILE FORMAT

Anda dapat menggunakan konektor ini untuk membaca melalui API sumber data di notebook Scala, Python, SQL, dan R.

Scala
// Get some data from an Azure Synapse table.
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("externalDataSource", "<your-pre-provisioned-data-source>")
  .option("dbTable", "<your-table-name>")
  .load()
Python
# Get some data from an Azure Synapse table.
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("externalDataSource", "<your-pre-provisioned-data-source>") \
  .option("dbTable", "<your-table-name>") \
  .load()
SQL
-- Read data using SQL.
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>',
  externalDataSource '<your-pre-provisioned-data-source>'
);
R
# 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>"
   externalDataSource = "<your-pre-provisioned-data-source>")

Izin Azure Synapse yang diperlukan untuk pernyataan COPY

Catatan

Tersedia untuk Databricks Runtime 7.0 ke atas.

Ketika Anda menggunakan pernyataan COPY, konektor Azure Synapse mengharuskan pengguna sambungan JDBC untuk memiliki izin untuk menjalankan perintah berikut dalam instans Azure Synapse yang tersambung:

Jika tabel tujuan tidak ada di Azure Synapse, izin untuk menjalankan perintah berikut diperlukan selain perintah di atas:

Tabel berikut meringkas izin untuk penulisan batch dan streaming dengan COPY:

Operasi Izin (menyisipkan ke dalam tabel yang sudah ada) Izin (menyisipkan ke dalam tabel baru)
Penulisan batch ADMINISTER DATABASE BULK OPERATIONS

INSERT
ADMINISTER DATABASE BULK OPERATIONS

INSERT

CREATE TABLE

ALTER ON SCHEMA :: dbo
Penulisan streaming ADMINISTER DATABASE BULK OPERATIONS

INSERT
ADMINISTER DATABASE BULK OPERATIONS

INSERT

CREATE TABLE

ALTER ON SCHEMA :: dbo

Parameter

Peta parameter atau OPTIONS yang disediakan di SQL Spark mendukung pengaturan berikut:

Parameter Wajib Default Catatan
dbTable Ya, kecuali query ditentukan Tidak ada default Tabel untuk dibuat atau dibaca di Azure Synapse. Parameter ini diperlukan ketika menyimpan data kembali ke Azure Synapse.

Anda juga dapat menggunakan {SCHEMA NAME}.{TABLE NAME} untuk mengakses tabel dalam skema tertentu. Jika nama skema tidak disediakan, skema default yang dikaitkan dengan pengguna JDBC digunakan.

Varian dbtable yang sebelumnya didukung tidak digunakan lagi dan akan diabaikan dalam rilis mendatang. Gunakan nama “camel case” sebagai gantinya.
query Ya, kecuali dbTable ditentukan Tidak ada default Kueri untuk dibaca di Azure Synapse.

Untuk tabel yang dirujuk dalam kueri, Anda juga dapat menggunakan {SCHEMA NAME}.{TABLE NAME} untuk mengakses tabel dalam skema tertentu. Jika nama skema tidak disediakan, skema default yang dikaitkan dengan pengguna JDBC digunakan.
user No Tidak ada default Nama pengguna Azure Synapse. Harus digunakan bersamaan dengan opsi password. Hanya dapat digunakan jika pengguna dan kata sandi tidak diteruskan di URL. Meneruskan keduanya akan mengakibatkan kesalahan.
password No Tidak ada default Kata sandi Azure Synapse. Harus digunakan bersamaan dengan opsi user. Hanya dapat digunakan jika pengguna dan kata sandi tidak diteruskan di URL. Meneruskan keduanya akan mengakibatkan kesalahan.
url Ya Tidak ada default URL JDBC dengan sqlserver diatur sebagai subprotokol. Disarankan untuk menggunakan string koneksi yang disediakan oleh portal Azure. Pengaturan
encrypt=true sangat disarankan, karena memungkinkan enkripsi SSL sambungan JDBC. Jika user dan password diatur secara terpisah, Anda tidak perlu menyertakannya ke dalam URL.
jdbcDriver No Ditentukan oleh subprotokol URL JDBC Nama kelas driver JDBC yang digunakan. Kelas ini harus berada pada jalur kelas. Dalam kebanyakan kasus, seharusnya tidak perlu menentukan opsi ini, karena nama kelas driver yang sesuai seharusnya secara otomatis ditentukan oleh subprotokol URL JDBC.

Varian jdbc_driver yang sebelumnya didukung tidak digunakan lagi dan akan diabaikan dalam rilis mendatang. Gunakan nama “camel case” sebagai gantinya.
tempDir Ya Tidak ada default URI abfss. Sebaiknya Anda menggunakan kontainer penyimpanan Blob terdedikasi untuk Azure Synapse.

Varian tempdir yang sebelumnya didukung tidak digunakan lagi dan akan diabaikan dalam rilis mendatang. Gunakan nama “camel case” sebagai gantinya.
tempFormat No PARQUET Format untuk menyimpan file sementara ke penyimpanan blob ketika menulis ke Azure Synapse. Didefault ke PARQUET; tidak ada nilai lain yang diizinkan saat ini.
tempCompression No SNAPPY Algoritma kompresi yang akan digunakan untuk menyandikan/memecahkan kode sementara oleh Spark maupun Azure Synapse. Nilai yang didukung saat ini adalah: UNCOMPRESSED, SNAPPY, dan GZIP.
forwardSparkAzureStorageCredentials No salah Jika true, pustaka secara otomatis menemukan kredensial yang digunakan Spark untuk tersambung ke kontainer penyimpanan Blob dan meneruskan kredensial tersebut ke Azure Synapse melalui JDBC. Kredensial ini dikirimkan sebagai bagian dari kueri JDBC. Oleh karena itu sangat disarankan agar Anda mengaktifkan enkripsi SSL dari koneksi JDBC ketika menggunakan opsi ini.

Versi konektor Azure Synapse saat ini memerlukan (tepatnya) salah satu dari forwardSparkAzureStorageCredentials, enableServicePrincipalAuth atau useAzureMSI diatur secara eksplisit ke true.

Varian forward_spark_azure_storage_credentials yang sebelumnya didukung tidak digunakan lagi dan akan diabaikan dalam rilis mendatang. Gunakan nama “camel case” sebagai gantinya.
useAzureMSI No salah Jika true, pustaka akan menentukan IDENTITY = 'Managed Service Identity' dan tanpa SECRET untuk kredensial tercakup database yang dibuatnya.

Versi konektor Azure Synapse saat ini memerlukan (tepatnya) salah satu dari forwardSparkAzureStorageCredentials, enableServicePrincipalAuth atau useAzureMSI diatur secara eksplisit ke true.
enableServicePrincipalAuth No salah Jika true, pustaka akan menggunakan kredensial perwakilan layanan yang disediakan untuk tersambung ke akun penyimpanan Azure dan Azure Synapse Analytics melalui JDBC.

Versi konektor Azure Synapse saat ini memerlukan (tepatnya) salah satu dari forwardSparkAzureStorageCredentials, enableServicePrincipalAuth atau useAzureMSI diatur secara eksplisit ke true.
tableOptions No CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN String yang digunakan untuk menentukan opsi tabel ketika membuat tabel Azure Synapse yang diatur melalui dbTable. String ini diteruskan secara harfiah ke klausul WITH dari pernyataan SQL CREATE TABLE yang diterbitkan terhadap Azure Synapse.

Varian table_options yang sebelumnya didukung tidak digunakan lagi dan akan diabaikan dalam rilis mendatang. Gunakan nama “camel case” sebagai gantinya.
preActions No Tanpa default (string kosong) Daftar perintah ; SQL yang terpisah untuk dijalankan di Azure Synapse sebelum menulis data ke instans Azure Synapse. Perintah SQL ini harus menjadi perintah valid yang diterima oleh Azure Synapse.

Jika salah satu dari perintah ini gagal, ia diperlakukan sebagai kesalahan dan operasi tulis tidak dijalankan.
postActions No Tanpa default (string kosong) Daftar perintah ; SQL yang terpisah untuk dijalankan di Azure Synapse setelah konektor berhasil menulis data ke instans Azure Synapse. Perintah SQL ini harus menjadi perintah valid yang diterima oleh Azure Synapse.

Jika salah satu perintah ini gagal, ia diperlakukan sebagai kesalahan dan Anda akan mendapatkan pengecualian setelah data berhasil ditulis ke instans Azure Synapse.
maxStrLength No 256 StringType di Spark dipetakan ke jenis NVARCHAR(maxStrLength) di Azure Synapse. Anda dapat menggunakan maxStrLength untuk mengatur panjang string untuk semua kolom jenis NVARCHAR(maxStrLength) yang ada dalam tabel bernama
dbTable di Azure Synapse.

Varian maxstrlength yang sebelumnya didukung tidak digunakan lagi dan akan diabaikan dalam rilis mendatang. Gunakan nama “camel case” sebagai gantinya.
checkpointLocation Ya Tidak ada default Lokasi pada DBFS yang akan digunakan oleh Streaming Terstruktur untuk menulis metadata dan informasi titik pemeriksaan. Lihat Pemulihan dari Kegagalan dengan Titik Pemeriksaan dalam panduan pemrograman Streaming Terstruktur.
numStreamingTempDirsToKeep No 0 Menunjukkan seberapa banyak direktori sementara (terbaru) yang harus disimpan untuk pembersihan berkala batch mikro dalam streaming. Jika diatur ke 0, penghapusan direktori dipicu segera setelah batch mikro diterapkan, jika tidak jumlah batch mikro terbaru yang disediakan disimpan dan sisa direktori dihapus. Gunakan -1 untuk menonaktifkan pembersihan berkala.
applicationName No Databricks-User-Query Tag sambungan untuk setiap kueri. Jika tidak ditentukan atau nilainya adalah string kosong, nilai default tag ditambahkan URL JDBC. Nilai default mencegah alat Azure DB Monitoring menerbitkan peringatan injeksi SQL palsu terhadap kueri.
maxbinlength No Tidak ada default Mengontrol panjang kolom dari kolom BinaryType. Parameter ini diterjemahkan sebagai VARBINARY(maxbinlength).
identityInsert No salah Pengaturan ke true mengaktifkan mode IDENTITY_INSERT, yang menyisipkan nilai yang disediakan DataFrame di kolom identitas tabel Azure Synapse.

Lihat Menyisipkan nilai secara eksplisit ke dalam kolom IDENTITY.
externalDataSource No Tidak ada default Sumber data eksternal yang telah disediakan sebelumnya untuk membaca data dari Azure Synapse. Sumber data eksternal hanya dapat digunakan dengan PolyBase dan menghapus persyaratan izin CONTROL karena konektor tidak perlu membuat kredensial tercakup dan sumber data eksternal untuk memuat data.

Untuk contoh penggunaan dan daftar izin yang diperlukan ketika menggunakan sumber data eksternal, lihat Izin Azure Synapse yang diperlukan untuk PolyBase dengan opsi sumber data eksternal.
maxErrors No 0 Jumlah maksimum baris yang dapat ditolak selama pembacaan dan penulisan sebelum operasi pemuatan (baik PolyBase atau COPY) dibatalkan. Baris yang ditolak akan diabaikan. Misalnya, jika dua dari sepuluh rekaman memiliki kesalahan, hanya delapan rekaman yang akan diproses.

Lihat dokumentasi REJECT_VALUE dalam dokumentasi BUAT TABEL EKSTERNAL dan MAXERRORS di COPY.

Catatan

  • tableOptions, preActions, postActions, dan maxStrLength hanya relevan ketika menulis data dari Azure Databricks ke tabel baru di Azure Synapse.
  • externalDataSource hanya relevan ketika membaca data dari Azure Synapse dan menulis data dari Azure Databricks ke tabel baru di Azure Synapse dengan semantik PolyBase. Anda tidak boleh menentukan jenis autentikasi penyimpanan lainnya saat menggunakan externalDataSource seperti forwardSparkAzureStorageCredentials atau useAzureMSI.
  • checkpointLocation dan numStreamingTempDirsToKeep hanya relevan untuk penulisan streaming dari Azure Databricks ke tabel baru di Azure Synapse.
  • Meskipun semua nama opsi sumber data tidak peka huruf besar/kecil, sebaiknya Anda menentukannya dalam “camel case” untuk kejelasan.

Pendorongan kueri ke dalam Azure Synapse

Konektor Azure Synapse mengimplementasikan set aturan pengoptimalan untuk mendorong operator berikut ke dalam Azure Synapse:

  • Filter
  • Project
  • Limit

Operator Project dan Filter mendukung ekspresi berikut:

  • Sebagian besar operator logika boolean
  • Perbandingan
  • Operasi aritmetika
  • Bentuk numerik dan string

Untuk operator Limit, pendorongan hanya didukung ketika tidak ada pengurutan yang ditentukan. Contohnya:

SELECT TOP(10) * FROM table, tetapi bukan SELECT TOP(10) * FROM table ORDER BY col.

Catatan

Konektor Azure Synapse tidak mendorong ekspresi yang beroperasi pada string, tanggal, atau stempel waktu.

Pendorongan kueri dibuat dengan konektor Azure Synapse diaktifkan secara default. Anda dapat menonaktifkannya dengan mengatur spark.databricks.sqldw.pushdown ke false.

Pengelolaan data sementara

Konektor Azure Synapse tidak menghapus file sementara yang dibuatnya di kontainer penyimpanan Blob. Oleh karena itu sebaiknya Anda menghapus file sementara secara berkala di dalam lokasi tempDir yang disediakan pengguna.

Untuk memfasilitasi pembersihan data, konektor Azure Synapse tidak menyimpan file data langsung di bawah tempDir, melainkan membuat subdirektori formulir: <tempDir>/<yyyy-MM-dd>/<HH-mm-ss-SSS>/<randomUUID>/. Anda dapat mengatur pekerjaan berkala (menggunakan fitur pekerjaan Azure Databricks atau lainnya) untuk berulang kali menghapus subdirektori yang lebih lama dari ambang tertentu (misalnya, 2 hari), dengan asumsi bahwa tidak mungkin ada pekerjaan Spark yang berjalan lebih lama dari ambang tersebut.

Alternatif yang lebih sederhana adalah secara berkala menghilangkan keseluruhan kontainer dan membuat yang baru dengan nama yang sama. Ini mengharuskan Anda menggunakan kontainer terdedikasi untuk data sementara yang dihasilkan oleh konektor Azure Synapse dan Anda dapat menemukan jendela waktu di mana Anda dapat menjamin bahwa tidak ada kueri yang melibatkan konektor yang berjalan.

Pengelolaan objek sementara

Konektor Azure Synapse mengotomatiskan transfer data antara kluster Azure Databricks dan instans Azure Synapse. Untuk membaca data dari tabel Azure Synapse atau kueri atau menulis data ke tabel Azure Synapse, konektor Azure Synapse membuat objek sementara, termasuk DATABASE SCOPED CREDENTIAL, EXTERNAL DATA SOURCE, EXTERNAL FILE FORMAT, dan EXTERNAL TABLE di balik layar. Objek-objek ini hanya hidup sepanjang durasi pekerjaan Spark yang sesuai dan secara otomatis akan dihilangkan setelahnya.

Ketika kluster menjalankan kueri menggunakan konektor Azure Synapse, jika proses driver Spark crash atau dimulai ulang secara paksa, atau jika kluster dihentikan atau dimulai ulang secara paksa, objek sementara mungkin tidak dihilangkan. Untuk memfasilitasi identifikasi dan penghapusan manual objek-objek ini, konektor Azure Synapse memberi prefiks pada nama semua objek sementara perantara yang dibuat di instans Azure Synapse dengan tag formulir: tmp_databricks_<yyyy_MM_dd_HH_mm_ss_SSS>_<randomUUID>_<internalObject>.

Sebaiknya anda mencari objek yang bocor secara berkala menggunakan kueri seperti berikut ini:

  • 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_%'

Pengelolaan tabel titik pemeriksaan streaming

Konektor Azure Synapse tidak menghapus tabel titik pemeriksaan streaming yang dibuat ketika kueri streaming baru dimulai. Perilaku ini konsisten dengan checkpointLocation pada DBFS. Oleh karena itu sebaiknya Anda secara berkala menghapus tabel titik pemeriksaan pada saat yang sama dengan penghapusan lokasi titik pemeriksaan pada DBFS untuk kueri yang tidak akan dijalankan di masa mendatang atau sudah dihapus lokasi titik pemeriksaannya.

Secara default, semua tabel titik pemeriksaan memiliki nama <prefix>_<query-id>, di mana <prefix> adalah prefiks yang dapat dikonfigurasi dengan nilai default databricks_streaming_checkpoint dan query_id merupakan ID kueri streaming dengan karakter _ dihapus. Untuk menemukan semua tabel titik pemeriksaan bagi kueri streaming yang kedaluwarsa atau dihapus, jalankan kueri:

SELECT * FROM sys.tables WHERE name LIKE 'databricks_streaming_checkpoint%'

Anda dapat mengonfigurasi prefiks dengan opsi konfigurasi SQL Spark spark.databricks.sqldw.streaming.exactlyOnce.checkpointTableNamePrefix.

Pertanyaan Umum (FAQ)

Saya menerima kesalahan saat menggunakan konektor Azure Synapse. Bagaimana cara mengetahui apakah kesalahan ini berasal dari Azure Synapse atau Azure Databricks?

Untuk membantu Anda mendebug kesalahan, pengecualian apa pun yang dilemparkan oleh kode yang khusus untuk konektor Azure Synapse dibalut dalam pengecualian yang memperluas ciri SqlDWException tersebut. Pengecualian juga membuat perbedaan berikut:

  • SqlDWConnectorException mewakili kesalahan yang dilemparkan oleh konektor Azure Synapse
  • SqlDWSideException mewakili kesalahan yang dilemparkan oleh instans Azure Synapse yang tersambung

Apa yang harus saya lakukan jika kueri saya gagal dengan kesalahan “Tidak ada kunci akses yang ditemukan di konf sesi atau konf global Hadoop”?

Kesalahan ini muncul karena konektor Azure Synapse tidak dapat menemukan kunci akses akun penyimpanan dalam konfigurasi sesi notebook atau konfigurasi global Hadoop bagi akun penyimpanan yang ditentukan dalam tempDir. Lihat Penggunaan (Batch) untuk contoh cara mengonfigurasi akses Akun Penyimpanan dengan benar. Jika tabel Spark dibuat menggunakan konektor Azure Synapse, Anda masih harus memberikan kredensial akses akun penyimpanan untuk membaca atau menulis ke tabel Spark.

Dapatkah saya menggunakan Tanda Tangan Akses Bersama (SAS) untuk mengakses kontainer penyimpanan Blob yang ditentukan oleh tempDir?

Azure Synapse tidak mendukung penggunaan SAS untuk mengakses penyimpanan Blob. Oleh karena itu konektor Azure Synapse tidak mendukung SAS untuk mengakses kontainer penyimpanan Blob yang ditentukan oleh tempDir.

Saya telah membuat tabel Spark menggunakan konektor Azure Synapse dengan opsi dbTable, menulis beberapa data ke tabel Spark ini, lalu menghilangkan tabel Spark ini. Apakah tabel yang dibuat di sisi Azure Synapse akan dihilangkan?

Tidak. Azure Synapse dianggap sebagai sumber data eksternal. Tabel Azure Synapse dengan nama yang diatur melalui dbTable tidak dihilangkan ketika tabel Spark dihilangkan.

Ketika menulis DataFrame ke Azure Synapse, mengapa saya perlu mengatakan .option("dbTable", tableName).save() dan bukan hanya .saveAsTable(tableName)?

Itu karena kami ingin memperjelas perbedaan berikut: .option("dbTable", tableName) mengacu pada tabel database(yaitu, Azure Synapse), sedangkan .saveAsTable(tableName) mengacu pada tabel Spark. Bahkan, Anda bahkan dapat menggabungkan keduanya: df.write. ... .option("dbTable", tableNameDW).saveAsTable(tableNameSpark) yang membuat tabel di Azure Synapse yang disebut tableNameDW dan tabel eksternal di Spark yang disebut tableNameSpark yang didukung oleh tabel Azure Synapse.

Peringatan

Waspadalah terhadap perbedaan antara .save() dan .saveAsTable() berikut:

  • Untuk df.write. ... .option("dbTable", tableNameDW).mode(writeMode).save(), writeMode bertindak pada tabel Azure Synapse, seperti yang diharapkan.
  • Untuk df.write. ... .option("dbTable", tableNameDW).mode(writeMode).saveAsTable(tableNameSpark), writeMode bertindak pada tabel Spark, sedangkan tableNameDW diam-diam ditimpa jika sudah ada di Azure Synapse.

Perilaku ini tidak berbeda dengan penulisan ke sumber data lainnya. Ini hanya merupakan peringatan dari API DataFrameWriter Spark.