错误I';当我写Pyspark代码与Snowflake连接时

错误I';当我写Pyspark代码与Snowflake连接时,pyspark,apache-spark-sql,snowflake-cloud-data-platform,Pyspark,Apache Spark Sql,Snowflake Cloud Data Platform,当我试图从Jupiter笔记本编写PySpark代码来连接Snowflake时,我遇到了一个错误。以下是我得到的错误: Py4JJavaError:调用o526.load时出错。 :java.lang.ClassNotFoundException:未能找到数据源:net.snowflake.spark.snowflake。请在 Spark版本:v2.4.5 船长:本地[*] Python3.X 这是我的密码: from pyspark import SparkConf, SparkContext

当我试图从Jupiter笔记本编写PySpark代码来连接Snowflake时,我遇到了一个错误。以下是我得到的错误:

Py4JJavaError:调用o526.load时出错。 :java.lang.ClassNotFoundException:未能找到数据源:net.snowflake.spark.snowflake。请在

Spark版本:v2.4.5 船长:本地[*] Python3.X

这是我的密码:

from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *

sc = SparkContext.getOrCreate()

spark = SparkSession.builder \
    .master("local") \
    .appName("Test") \
    .config('spark.jars','/Users/zhao/Downloads/snowflake-jdbc-3.5.4.jar,/Users/zhao/Downloads/spark-snowflake_2.11-2.3.2.jar') \
    .getOrCreate()

sfOptions = {
  "sfURL" : "xxx",
  "sfUser" : "xxx",
  "sfPassword" : "xxx",
  "sfDatabase" : "xxx",
  "sfSchema" : "xxx",
  "sfWarehouse" : "xxx",
  "sfRole": "xxx"
}

SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"

df = spark.read.format(SNOWFLAKE_SOURCE_NAME) \
  .options(**sfOptions) \
  .option("query",  "select * from CustomerInfo limit 10") \
  .load()

如果有人能给我一些建议,我将不胜感激:)

您的类路径中需要有spark snowflake连接器。按照官方页面的说明操作。

如何启动jupyter笔记本服务器实例?您是否确保正确设置了
PYTHONPATH
SPARK\u HOME
变量,并且SPARK没有预先运行实例?另外,您的雪花火花连接器是jar变体吗

以下是在macOS机器上完全引导和测试的运行,作为参考(使用):

#安装JDK8
~>brew tap采用openjdk/openjdk
~>brew cask安装采用OpenJDK8
#安装Apache Spark(自发布之日起为v2.4.5)
~>brew安装apache spark
#安装Jupyter笔记本电脑(包括可选的CLI笔记本电脑)
~>pip3安装——用户jupyter笔记本
#确保我们使用JDK8(使用最新的JDK将导致类版本问题)
~>export JAVA_HOME=“/Library/JAVA/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/HOME”
#设置允许发现PySpark库和Spark二进制文件的环境
#(使用自制功能动态设置路径)
~>export SPARK_HOME=“$(brew--前缀apache SPARK)/libexec”
~>导出PYTHONPATH=“${SPARK\u HOME}/python:${SPARK\u HOME}/python/build:${PYTHONPATH}”
~>export PYTHONPATH=“$(brew列表apache spark | grep'py4j-.*-src.zip$”| head-1):${PYTHONPATH}”
#将笔记本代码中依赖项的JAR下载到/tmp中
#雪花JDBC(这里使用的是v3.12.8):
~>curl--silent--location\
'https://search.maven.org/classic/remotecontent?filepath=net/snowflake/snowflake-jdbc/3.12.8/snowflake-jdbc-3.12.8.jar'\
>/tmp/snowflake-jdbc-3.12.8.jar
#雪花火花连接器(此处使用v2.7.2)
#但更重要的是,一个与Scala 2.11和Spark 2.4.x兼容的版本已经推出
~>curl--silent--location\
'https://search.maven.org/classic/remotecontent?filepath=net/snowflake/spark-雪花2.11/2.7.2-spark\u 2.4/spark-snowflake\u 2.11-2.7.2-spark\u 2.4.jar'\
>/tmp/spark-snowflake_2.11-2.7.2-spark_2.4.jar
#运行jupyter笔记本服务(在webbrowser中打开)
~>jupyter笔记本
在新的Python 3笔记本中运行代码:

from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *

sfOptions = {
    "sfURL": "account.region.snowflakecomputing.com",
    "sfUser": "username",
    "sfPassword": "password",
    "sfDatabase": "db_name",
    "sfSchema": "schema_name",
    "sfWarehouse": "warehouse_name",
    "sfRole": "role_name",
}

spark = SparkSession.builder \
    .master("local") \
    .appName("Test") \
    .config('spark.jars','/tmp/snowflake-jdbc-3.12.8.jar,/tmp/spark-snowflake_2.11-2.7.2-spark_2.4.jar') \
    .getOrCreate()

SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"

df = spark.read.format(SNOWFLAKE_SOURCE_NAME) \
    .options(**sfOptions) \
    .option("query",  "select * from CustomerInfo limit 10") \
    .load()

df.show()

上面的示例使用读取方法(将数据从Snowflake移动到Spark),但如果您想改为编写数据帧,请参阅上的文档。

我已经按照@user13472370的答案中描述的步骤进行了操作,另外还有相同的库版本,我使用相同的雪花连接参数从SQL Workbench连接到Snowflave。然而,我仍然收到相同的错误

An error occurred while calling o43.load.
    : java.lang.NoClassDefFoundError: scala/Product$class
        at net.snowflake.spark.snowflake.Parameters$MergedParameters.<init>(Parameters.scala:288)
调用o43.load时发生错误。 :java.lang.NoClassDefFoundError:scala/Product$class net.snowflake.spark.snowflake.Parameters$MergedParameters.(Parameters.scala:288)
更新:同时,我发现了一个使用AWS Glue服务的易于实现的解决方案:

谢谢分享。为了回答你的问题,我在终端上运行了Jupiter笔记本。只是想知道如果我没有将SPARK_HOME和PYTHONPATH导出,这是否意味着即使我可以启动SPARK实例,它也不会工作?我发现我的SPARK_主页路径应该是:export SPARK_HOME=“/Users/Zhao/opt/anaconda3/lib/python3.7/site packages/pyspark”我需要在我的.bash_配置文件中设置SPARK_主页和PYTHON_路径才能工作吗?谢谢我将JAVA_HOME、SPARK_HOME和PYTHONPATH添加到~/.bash_配置文件中,并重新运行SPARK,但仍然不起作用。导出JAVA_HOME=/Library/JAVA/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/HOME导出SPARK_HOME=/Users/zhao/opt/anaconda3/lib/python3.7/site-packages/python3.7/python3.7/SPARK-HOME:$SPARK_-HOME:$SPARK_-HOME:$PATH:$PATH:$JAVA_-HOME/bin:$JAVA_:$JAVA_-HOME/bin:$JAVA_:$JAVA_-HOME/bin:$JAVA_-HOME/$PYTHONPATH=$$python/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH导出PYTHONPATH=${SPARK_HOME}/python/lib/pyspark.zip:$PYTHONPATH刚刚发现,问题是SPARK预先运行了一个实例,在我杀死了那个PID之后它就可以工作了。同时,您知道如何将spark数据帧写入雪花表吗?任何我可以参考的示例代码都非常好。再次感谢!谢谢,非常有帮助!!youtube上有一个很好的视频,演示了如何设置以及如何将snowflake+python与cli以及pycharm连接起来。在那里搜索hashtag#dataengineeringsimplified python,您将得到它。