【问题标题】:Join data in Azure Synapse from dedicated sql pool and serverless sql pool从专用 sql 池和无服务器 sql 池加入 Azure Synapse 中的数据
【发布时间】:2021-06-06 09:56:25
【问题描述】:

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

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

【问题讨论】:

    标签: azure-synapse


    【解决方案1】:

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

    1. 从专用 SQL 池中执行。您将有权访问您的专用表,并且根据您的无服务器 SQL 池 OPENROWSET 查询的定义,您可能能够在专用范围内重现它,例如作为外部表。如果您在无服务器中创建了视图,则目前无法从专用视图直接引用它。 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")
      

    获取对无服务器对象的访问涉及更多,但我得到这个 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 池成本的优点,即使用专用来导入和处理数据,将其转储然后暂停。

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

    【讨论】:

    • 不是我希望的答案。看起来我们需要把所有东西都放到专用池中,但是我们可以用 Snowflake 代替。
    • @RonDunn 对此有何看法或我错过了什么?路线图上有什么可能有帮助的吗?谢谢
    • 对 Snowflake 感兴趣 - 只是出于兴趣,会有什么不同?
    • @wBob,我相信我的 db-reader 设置错误。我不知道从哪里重置它们。我在聊天中制定解决方案没有任何问题。您可以在之后发布答案并将接受。这是一项紧迫的工作。 stackoverflow.com/questions/67329558/…
    • 本节也讨论 db_exporter 角色:docs.microsoft.com/en-us/azure/synapse-analytics/spark/…
    猜你喜欢
    • 2021-05-28
    • 2023-02-17
    • 2021-10-11
    • 2021-12-25
    • 2022-10-04
    • 2021-12-20
    • 2021-09-19
    • 2022-06-28
    • 2021-10-04
    相关资源
    最近更新 更多