我在 AzureSynapse 无服务器池中定义了一个视图,该视图使用 openrowset 获取数据。我在专用 sql 池中的表中也有数据。
我可以做一个连接这两个表的 sql 查询吗?
答案 0 :(得分:2)
Azure Synapse Analytics 确实有三个独立的引擎(至少我是这么看的),您的 SQL 查询必须从这些引擎之一执行,这为您提供了选择:
从专用 SQL 池内部执行。您将有权访问您的专用表,并且根据您的无服务器 SQL 池 OPENROWSET
查询的定义,您可以在专用表中重现它,例如作为外部表。如果您已经在 serverless 中创建了一个视图,那么此时无法直接从专用的引用它。 Dedicated 不像 serverless 那样支持 OPENROWSET(此时)。
从无服务器内部执行。您将无法从专用表直接访问您的表,但您可以使用 CREATE EXTERNAL TABLE AS (CETAS)
将其转储到您的数据湖中,然后您可以使用另一个 OPENROWSET
查询从无服务器读取它。>
从 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 池成本的优点,即使用专用于导入和处理数据,将其转储然后暂停。
>感觉应该更简单吧?也许我遗漏了一些东西,或者这可能是为了改进路线图。