从专用 sql 池和无服务器 sql 池中加入 Azure Synapse 中的数据

Join data in Azure Synapse from dedicated sql pool and serverless sql pool

我在 AzureSynapse 无服务器池中定义了一个视图,该视图使用 openrowset 获取数据。我在专用 sql 池中的 table 中也有数据。

我可以做一个 sql 查询来连接这两个 table 吗?

Azure Synapse Analytics 确实具有三个独立的引擎(至少我是这样认为的),您的 SQL 查询必须从这些引擎之一执行,这为您提供了选择:

  1. 从专用 SQL 池中执行。您将可以访问您的专用 table,并且根据无服务器 SQL 池 OPENROWSET 查询的定义,您 可能 能够 在专用内复制它,例如作为外部table。如果你已经在 serverless 中创建了一个视图,那么此时没有办法直接从 dedicated 中引用它。 Dedicated 不像无服务器那样支持 OPENROWSET(此时)。

  2. 从无服务器内部执行。您将无法从专用设备直接访问您的 table,但您可以使用 CREATE EXTERNAL TABLE AS (CETAS) 将其转储到您的数据湖中,这样您就可以使用另一个 OPENROWSET 从无服务器中读取它查询。

  3. 从 Apache Spark 池执行。使用第三个引擎将另外两个引擎组合在一起。从 Azure Analytics Spark 笔记本中访问专用 tables 就像 运行 spark.read.synapsesql 使用三部分名称一样简单。这是一个简单的例子(在 Scala 中)

    val dfNation = spark.read.synapsesql("tpch_ded.dbo.nation")
    
    dfNation.show
    
    dfNation.createOrReplaceTempView("nation")
    

访问无服务器对象有点复杂,但我在 Jovan Popovich 的启发下得到了这个 Scala 示例 here:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

val jdbcHostname = "XXX-ondemand.sql.azuresynapse.net"
val jdbcPort = 1433
val jdbcDatabase = "master"

//Create connection String
val jdbcUrl = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=60;"

import java.util.Properties
val props = new Properties()
val jdbcUsername = "someSQLUser"
val jdbcPassword = "xxx"
props.put("user", s"${jdbcUsername}")
props.put("password", s"${jdbcPassword}")

val driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
props.put("Driver", s"${driverClass}")

val sqlQuery = """select top 10 * 
from openrowset( 
    bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.parquet', 
    format = 'parquet') AS rows"""


// this worked but isn't using the prop object
 val df = spark.read.format("jdbc").
     option("url", jdbcUrl).
     option("user", s"${jdbcUsername}").
     option("password", s"${jdbcPassword}").
     option("Driver", s"${driverClass}").
     option("query", sqlQuery).
     load()

df.show(false)

因此您可以使用 join 将两个数据帧放在笔记本中。 Spark 池和无服务器 SQL 池也有 shared metadata model so you can create managed\unmanaged tables in Spark and they appear in serverless. Better examples here.

我们目前正在考虑使用模式 2,它有重复的缺点和降低专用 SQL 池成本的优点,即使用专用的导入和处理数据,将其转储出来然后暂停。

感觉应该更简单吧?也许我遗漏了一些东西,或者这可能会改进路线图。