由网友(没本事别惹我)分享简介:我在Azure中使用Synapse。我在无服务器的SQL池中有数据。我想将该数据导入到Databricks中的数据框中。我收到以下错误:Py4JJavaError: An error occurred while calling o568.load.: java.lang.ClassNotFoundExcepti...
我在Azure中使用Synapse。我在无服务器的SQL池中有数据。我想将该数据导入到Databricks中的数据框中。
我收到以下错误:
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无服务器池数据库。 我已尝试使用集成身份验证,结果相同。在我看来,该错误看起来像是Databricks找不到com.database ricks.park.sqldw格式,但这可能是转移注意力的问题。
感谢您的建议和专业知识
推荐答案
使用Azure Synapse Analytics的优势之一是集成,因为存储、数据库、流水线、笔记本等各种组件倾向于一起工作,比设置独立组件更容易一些,例如数据库笔记本,在那里您必须编写像您一样的代码,包括hadoopConfiguration
等
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池,我最初对它没有内置感到沮丧,但如果你仔细想想,你会使用重复的服务,即无服务器引擎查询底层文件,而ApacheSpark池查询占位符/外部表,这实际上是查询它们的底层文件。因此,您不妨使用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。
相关推荐
最新文章