【问题标题】:azure synapse: connecting to serverless sql pool from databricks - Failed to find data source: com.databricks.spark.sqldwazure synapse:从 databricks 连接到无服务器 sql 池 - 找不到数据源:com.databricks.spark.sqldw
【发布时间】:2021-10-04 09:05:29
【问题描述】:

我在 azure 中使用突触。我在无服务器 sql 池中有数据。我想将该数据导入数据块中的数据框。

我收到以下错误:

Py4JJavaError: An error occurred while calling o568.load.
: java.lang.ClassNotFoundException: Failed to find data source: com.databricks.spark.sqldw. Please find packages at http://spark.apache.org/third-party-projects.html
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:656)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:195)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:168)
    at sun.reflect.GeneratedMethodAccessor102.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.databricks.spark.sqldw.DefaultSource
...
...
...

我使用的pyspark代码是:

spark.conf.set(
  "fs.azure.account.key.adlsAcct.blob.core.windows.net",
  "GVk3234fds2JX/fahOcjig3gNy198yasdhfkjasdyf87HWmDVlx1wLRmu7asdfaP3g==")



sc._jsc.hadoopConfiguration().set(
  "fs.azure.account.key.adlsAcct.blob.core.windows.net",
  "GVk3234fds2JX/fahOcjig3gNy198yasdhfkjasdyf87HWmDVlx1wLRmu7asdfaP3g==")


  
df = spark.read \
.format("com.databricks.spark.sqldw") \
.option("url","jdbc:sqlserver://synapse-myworkspace-ondemand.sql.azuresynapse.net:1433;database=myDB;user=myUser;password=userPass123;encrypt=false;trustServerCertificate=true;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;") \
.option("tempdir", "wasbs://projects@adlsAcct.dfs.core.windows.net/Lakehouse/tempDir") \
.option("forwardSparkAzureStorageCredentials","true") \
.option("dbtble","tbl_sampledata") \
.load()

我可以确认:

  • 已配置允许 Azure 服务连接的防火墙设置。
  • 用户有权访问 sql serverless pool 数据库。
  • 我尝试过集成身份验证,得到了相同的结果。

在我看来,错误看起来像 databricks 找不到格式 com.databricks.spark.sqldw,但这可能是一个红鲱鱼。

感谢任何建议和专业知识

【问题讨论】:

    标签: azure-databricks azure-synapse


    【解决方案1】:

    使用 Azure Synapse Analytics 的优点之一是集成,因为存储、数据库、管道、笔记本等的各种组件往往比设置独立组件更容易协同工作,例如 Databricks 笔记本,您必须在其中编写与您类似的代码,包括 hadoopConfiguration

    将数据从专用 SQL 池获取到 Synapse 笔记本的一种简单方法是使用 synapsesql 方法。一个简单的例子:

    %%spark
    // Get the table with synapsesql method and expose as temp view
    val df = spark.read.synapsesql("dedi_pool.dbo.someTable")
    
    df.createOrReplaceTempView("someTable")
    

    不幸的是,这种方法目前仅在 Scala 中实现(据我所知),但您可以将数据框保存为临时视图,将其公开给 SparkSQL 和 Python:

    %%sql
    SELECT * FROM someTable;
    

    这是在 Python 中检索临时视图的 Python:

    %%pyspark
    ## Get the table with synapsesql method and expose as temp view
    df = spark.sql("select * from someTable")
    
    df.show()
    

    这是我的结果:

    查看该技术的主要文档here

    对于无服务器 SQL 池,我最初对它没有内置感到沮丧,但如果你仔细想想,你会使用重复的服务,即无服务器引擎来查询底层文件和 Apache Spark 池来查询占位符/外部表,它有效地查询它们的底层文件。因此,您不妨直接使用spark.read 和任何文件格式(例如.csv)引用文件。取自docs的示例:

    %%pyspark
    df = spark.read.load('abfss://users@contosolake.dfs.core.windows.net/NYCTripSmall.parquet', format='parquet')
    display(df.limit(10))
    

    这就是我的想法:

    然而,这在技术上是可行的,我介绍了该技术here

    【讨论】:

    • 谢谢你,它很有帮助。长而短的是突触 sql 池的 apache spark 连接器不适用于无服务器。我可以看到的主要用例是当我想简单地连接表或查询为我连接基础数据文件的视图时。暂时只能直接导入文件。谢谢!
    猜你喜欢
    • 2022-01-06
    • 2021-06-06
    • 2020-10-15
    • 2021-09-05
    • 2021-05-27
    • 1970-01-01
    • 2021-09-19
    • 2021-12-22
    • 2021-06-10
    相关资源
    最近更新 更多