我写这篇文章不是为了提问,而是分享知识。 我用Spark连接到雪花。但我无法访问雪花。似乎在数据库中内部JDBC驱动程序有问题。
这是我得到的错误。
java.lang.NoClassDefFoundError:net/snowflake/client/jdbc/internal/snowflake/common/core/S3FileEncryptionMaterial
我尝试了很多版本的雪花jdbc驱动程序和雪花驱动程序。好像我能匹配正确的那个。
我向databricks支持提出了票,并从他们那里得到了解决方案。它现在运作良好。
步骤1:使用Spark版本创建集群 - 2.3.0。和Scala版本 - 2.11
第2步:将snowke-jdbc-3.5.4.jar附加到集群。
https://mvnrepository.com/artifact/net.snowflake/snowflake-jdbc/3.5.4
第3步:将spark-snowflake_2.11-2.3.2驱动程序附加到集群。
https://mvnrepository.com/artifact/net.snowflake/spark-snowflake_2.11/2.3.2
这是示例代码。
val SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"
val sfOptions = Map(
"sfURL" -> "<snowflake_url>",
"sfAccount" -> "<your account name>",
"sfUser" -> "<your account user>",
"sfPassword" -> "<your account pwd>",
"sfDatabase" -> "<your database name>",
"sfSchema" -> "<your schema name>",
"sfWarehouse" -> "<your warehouse name>",
"sfRole" -> "<your account role>",
"region_id"-> "<your region name, if you are out of us region>"
)
val df: DataFrame = sqlContext.read
.format(SNOWFLAKE_SOURCE_NAME)
.options(sfOptions)
.option("dbtable", "<your table>")
.load()
如果您遇到同样的问题,希望它会有所帮助。
答案 0 :(得分:3)
如果您正在使用Databricks,则有一个Databricks Snowflake connector由Databricks和Snowflake员工共同创建。您只需要提供一些项目即可创建Spark数据框(请参见下文-从Databricks文档中复制)。
# snowflake connection options
options = dict(sfUrl="<URL for your Snowflake account>",
sfUser=user,
sfPassword=password,
sfDatabase="<The database to use for the session after connecting>",
sfSchema="<The schema to use for the session after connecting>",
sfWarehouse="<The default virtual warehouse to use for the session after connecting>")
df = spark.read \
.format("snowflake") \
.options(**options) \
.option("dbtable", "<The name of the table to be read>") \
.load()
display(df)
只要您在正确授予所有访问权限的情况下访问自己的数据库,即使在我们第一次尝试时,也只需几分钟。
祝你好运!
答案 1 :(得分:0)
由提问者给出的答案(我只是从问题中提取了答案,以提高网站的可用性:
步骤1:使用Spark版本-2.3.0创建集群。和Scala版本-2.11
步骤2:将雪花jdbc-3.5.4.jar附加到集群。
https://mvnrepository.com/artifact/net.snowflake/snowflake-jdbc/3.5.4
步骤3:将spark-snowflake_2.11-2.3.2驱动程序附加到集群。
https://mvnrepository.com/artifact/net.snowflake/spark-snowflake_2.11/2.3.2
这是示例代码。
val SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"
val sfOptions = Map(
"sfURL" -> "<snowflake_url>",
"sfAccount" -> "<your account name>",
"sfUser" -> "<your account user>",
"sfPassword" -> "<your account pwd>",
"sfDatabase" -> "<your database name>",
"sfSchema" -> "<your schema name>",
"sfWarehouse" -> "<your warehouse name>",
"sfRole" -> "<your account role>",
"region_id"-> "<your region name, if you are out of us region>"
)
val df: DataFrame = sqlContext.read
.format(SNOWFLAKE_SOURCE_NAME)
.options(sfOptions)
.option("dbtable", "<your table>")
.load()
答案 2 :(得分:0)
您需要将CLASSPATH变量设置为指向jar,如下所示。除了PYTHONPATH之外,还需要设置SPARK_HOME和SCALA_HOME。
export CLASSPATH = / snowflake-jdbc-3.8.0.jar:/spark-snowflake_2.11-2.4.14-spark_2.4.jar
您还可以在代码中加载内存罐来解决此问题。
spark = SparkSession \ .builder \ .config(“ spark.jars”,“ file:///app/snowflake-jdbc-3.9.1.jar、file:///app/spark-snowflake_2.11-2.5.3-spark_2.2.jar” )\ .config(“ spark.repl.local.jars”, “文件:///app/snowflake-jdbc-3.9.1.jar,文件:///app/spark-snowflake_2.11-2.5.3-spark_2.2.jar”)\ .config(“ spark.sql.catalogImplementation”,“内存中”)\ .getOrCreate()
答案 3 :(得分:-1)
请更新到最新版本的Snowflake JDBC驱动程序(3.2.5);应该可以解决这个问题。谢谢!