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

问题描述

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

我可以做一个连接这两个表的 sql 查询吗?

解决方法

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

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

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

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

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

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

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,因此您可以在 Spark 中创建托管\非托管表,并且它们出现在无服务器中。更好的例子here

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

>

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