Överföra data mellan SQL och Spark-pool i Azure Synapse Analytics

Slutförd

I det här avsnittet får du lära dig mer om hur du använder Microsoft Entra-ID för att överföra data till och från en Apache Spark-pool och en dedikerad SQL-pool som är ansluten till arbetsytan som du har skapat för ditt Azure Synapse Analytics-konto. Om du använder notebook-miljön från Azure Synapse Studio-miljön som är länkad till din arbetsyteresurs behöver du inte använda importinstruktioner. Importinstruktioner krävs bara när du inte går igenom den integrerade notebook-upplevelsen.

Det är viktigt att konstanterna och SqlAnalyticsConnector konfigureras enligt nedan:

 #scala
 import com.microsoft.spark.sqlanalytics.utils.Constants
 import org.apache.spark.sql.SqlAnalyticsConnector._

Om du vill läsa data från en dedikerad SQL-pool bör du använda läs-API:et. Läs-API:et fungerar för interna tabeller (hanterade tabeller) och externa tabeller i den dedikerade SQL-poolen.

Läs-API:et med Microsoft Entra-ID ser ut så här:

#scala
val df = spark.read.sqlanalytics("<DBName>.<Schema>.<TableName>")

Parametrarna som tas in är:

  • DBName: namnet på databasen.
  • Schema: schemadefinitionen, till exempel dbo.
  • TableName: namnet på den tabell som du vill läsa data från.

Om du vill skriva data till en dedikerad SQL-pool bör du använda skriv-API:et. Skriv-API:et skapar en tabell i den dedikerade SQL-poolen. Sedan anropas Polybase för att läsa in data i tabellen som skapades. En sak att tänka på är att tabellen inte redan kan finnas i den dedikerade SQL-poolen. Om det händer får du ett felmeddelande som anger: "Det finns redan ett objekt med namnet..."

Skriv-API:et med Microsoft Entra-ID ser ut så här:

df.write.sqlanalytics("<DBName>.<Schema>.<TableName>", <TableType>)

Parametrarna som tas in är:

  • DBName: namnet på databasen.
  • Schema: schemadefinitionen, till exempel dbo.
  • TableName: namnet på den tabell som du vill läsa data från.
  • TableType: specifikation av typen av tabell, som kan ha två värden.
    • Constants.INTERNAL – Hanterad tabell i en dedikerad SQL-pool
    • Constants.EXTERNAL – extern tabell i en dedikerad SQL-pool

Parametern TableType i skriv-API:et har några extra parametrar att tänka på enligt ovan.

Ett exempel på en SQL-poolhanterad tabell ser ut så här:

df.write.sqlanalytics("<DBName>.<Schema>.<TableName>", Constants.INTERNAL)

Om du vill använda en extern SQL-pooltabell måste du ha en EXTERN DATAKÄLLA och ett EXTERNT FILFORMAT som finns i poolen med hjälp av följande exempel:

--For an external table, you need to pre-create the data source and file format in dedicated SQL pool using SQL queries:
CREATE EXTERNAL DATA SOURCE <DataSourceName>
WITH
  ( LOCATION = 'abfss://...' ,
    TYPE = HADOOP
  ) ;

CREATE EXTERNAL FILE FORMAT <FileFormatName>
WITH (  
    FORMAT_TYPE = PARQUET,  
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'  
);

Det är inte nödvändigt att skapa ett externt CREDENTIAL-objekt om du använder Microsoft Entra-direktautentisering från lagringskontot. Det enda du behöver tänka på är att du måste vara medlem i rollen "Storage Blob Data Contributor" på lagringskontot. Nästa steg är att använda kommandot df.write i Scala med kommandot DATA_SOURCE, FILE_FORMAT och sqlanalytics på ett liknande sätt som att skriva data till en intern tabell.

Exemplet visas nedan:


df.write.
    option(Constants.DATA_SOURCE, <DataSourceName>).
    option(Constants.FILE_FORMAT, <FileFormatName>).
    sqlanalytics("<DBName>.<Schema>.<TableName>", Constants.EXTERNAL)