【发布时间】:2021-06-06 09:56:25
【问题描述】:
我在 AzureSynapse 无服务器池中定义了一个视图,它使用 openrowset 获取数据。我在专用 sql 池中的表中也有数据。
我可以做一个 sql 查询来连接这两个表吗?
【问题讨论】:
标签: azure-synapse
我在 AzureSynapse 无服务器池中定义了一个视图,它使用 openrowset 获取数据。我在专用 sql 池中的表中也有数据。
我可以做一个 sql 查询来连接这两个表吗?
【问题讨论】:
标签: azure-synapse
Azure Synapse Analytics 确实具有三个独立的引擎(至少我是这么看的),您的 SQL 查询必须从这些引擎之一执行,这让您可以选择:
从专用 SQL 池中执行。您将有权访问您的专用表,并且根据您的无服务器 SQL 池 OPENROWSET 查询的定义,您可能能够在专用范围内重现它,例如作为外部表。如果您在无服务器中创建了视图,则目前无法从专用视图直接引用它。 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")
获取对无服务器对象的访问涉及更多,但我得到这个 Scala 示例的工作灵感来自 Jovan Popovich 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,因此您可以在 Spark 中创建托管\非托管表,它们会出现在无服务器中。更好的例子here。
我们目前正在考虑使用模式 2,它有重复的缺点,但有降低专用 SQL 池成本的优点,即使用专用来导入和处理数据,将其转储然后暂停。
感觉应该更简单吧?也许我遗漏了一些东西,或者这可能会改进路线图。
【讨论】: