从 Spark 到雪花的连接

Posted

技术标签:

【中文标题】从 Spark 到雪花的连接【英文标题】:Connection from Spark to snowflake 【发布时间】:2018-10-20 05:22:45 【问题描述】:

我写这篇文章不是为了问问题,而是为了分享知识。 我正在使用 Spark 连接到雪花。但我无法访问雪花。 databricks 中的内部 JDBC 驱动程序似乎有问题。

这是我得到的错误。

java.lang.NoClassDefFoundError:net/snowflake/client/jdbc/internal/snowflake/common/core/S3FileEncryptionMaterial

我尝试了很多版本的雪花 jdbc 驱动和雪花驱动。看来我可以匹配正确的。

【问题讨论】:

非常感谢您的意图,但此后您可以提出带有错误消息和其他详细信息的问题。在答案部分,您可以添加您的步骤和代码 sn-ps。 : 回顾 它的 [snowflake-datawarehouse] 不是雪花模式修改标签 【参考方案1】:

如果您使用 Databricks,有一个由 Databricks 和 Snowflake 人共同创建的Databricks Snowflake connector。您只需提供一些项目来创建 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)

只要您在正确授予所有访问权限的情况下访问自己的数据库,这只需几分钟,即使在我们第一次尝试时也是如此。

祝你好运!

【讨论】:

【参考方案2】:

您需要将 CLASSPATH 变量设置为指向 jar,如下所示。除了 PYTHONPATH 之外,您还需要设置 SPARK_HOME 和 SCALA_HOME。


导出 CLASSPATH=/snowflake-jdbc-3.8.0.jar:/spark-snowflake_2.11-2.4.14-spark_2.4.jar


您也可以在代码中加载内存 jar 来解决此问题。


火花 = SparkSession \ .建造者\ .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", "file:///app/snowflake-jdbc-3.9.1.jar,file:///app/spark-snowflake_2.11-2.5.3-spark_2.2.jar") \ .config("spark.sql.catalogImplementation", "in-memory") \ .getOrCreate()


【讨论】:

【参考方案3】:

回答由提问者给出(我只是从问题中提取它以提高网站可用性:

第 1 步:使用 Spark 版本 - 2.3.0 创建集群。和 Scala 版本 - 2.11 第 2 步:将 snowflake-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()

【讨论】:

【参考方案4】:

请更新至最新版本的 Snowflake JDBC 驱动程序 (3.2.5);那应该可以解决这个问题。谢谢!

【讨论】:

以上是关于从 Spark 到雪花的连接的主要内容,如果未能解决你的问题,请参考以下文章

需要从 JAVA UDF 连接雪花表

使用分区的雪花到 Hive 数据移动

从雪花加载数组数据到neo4j

使用雪花连接器和 COPY INTO 功能将 csv 上传到雪花时如何指定分隔符

如何使用 Spark/PySpark 删除雪花目标表

Microsoft Access 的雪花连接字符串