如何正确设置 PySpark - Snowflake 连接的变量?

Posted

技术标签:

【中文标题】如何正确设置 PySpark - Snowflake 连接的变量?【英文标题】:How to properly set variables for PySpark - Snowflake connection? 【发布时间】:2020-11-09 03:40:12 【问题描述】:

我正在使用该文档并尝试运行此处找到的简单脚本:https://docs.snowflake.com/en/user-guide/spark-connector-use.html

Py4JJavaError: An error occurred while calling o37.load.
: java.lang.ClassNotFoundException: Failed to find data source: net.snowflake.spark.snowflake.

我的代码如下。我还尝试使用位于/Users/Hana/spark-sf/ 目录中的 jdbc 和 spark-snowflake jar 的路径设置配置选项,但没有运气。

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

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config('spark.jars','/Users/Hana/spark-sf/snowflake-jdbc-3.12.9.jar,/Users/Hana/spark-sf/spark-snowflake_2.12-2.8.1-spark_3.0.jar') \
    .getOrCreate()

# Set options below
sfOptions = 
  "sfURL" : "<account_name>.snowflakecomputing.com",
  "sfUser" : "<user_name>",
  "sfPassword" : "<password>",
  "sfDatabase" : "<database>",
  "sfSchema" : "<schema>",
  "sfWarehouse" : "<warehouse>"


SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"


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

df.show()

我应该如何正确设置变量?以及需要设置哪些?如果有人可以帮助列出这些步骤,我将不胜感激!

【问题讨论】:

【参考方案1】:

你能不能只尝试“雪花”格式

所以你的数据框会有

df = spark.read.format("snowflake") \
  .options(**sfOptions) \
  .option("query",  "select * from table limit 200") \
  .load()

或将SNOWFLAKE_SOURCE_NAME 变量设置为

SNOWFLAKE_SOURCE_NAME = "snowflake"

【讨论】:

感谢您的输入 - 我试过了,我现在收到此错误:java.lang.ClassNotFoundException: Failed to find data source: snowflake. 你能点击这个链接吗:***.com/questions/62957222/…【参考方案2】:

在配置本地开发环境时,我也一直在为“找不到数据源”而苦苦挣扎。 安装并设置我的环境变量后: HADOOP_HOME SCALA_HOME SPARK_CLASSPATH SPARK_HOME 并更新了Path 变量,我已经安装了雪花连接器:

pip install -r https://raw.githubusercontent.com/snowflakedb/snowflake-connector-python/v2.7.2/tested_requirements/requirements_39.reqs
pip install snowflake-connector-python==2.7.2
pyspark --packages net.snowflake:snowflake-jdbc:3.13.10,net.snowflake:spark-snowflake_2.12:2.9.2-spark_3.1

我试图在我的 python 代码中使用雪花数据源::

conf = SparkConf().setAppName('MYAPP').setMaster("local[*]")
sc = SparkContext(conf=conf)
spark_sql = SQLContext(sc)

df = spark_sql.read.format("snowflake")\
  .options(**sfOptions)\
  .option("query", query)\
  .load()`enter code here`

但是pyspark似乎仍然不知道支持snowflake数据源扩展所需的jar。

为了解决问题,我终于把需要的包添加到SparkConf

conf = SparkConf() \
    .setAppName('MYAPP') \
    .setMaster("local[*]") \
    .set("spark.jars.packages", "net.snowflake:snowflake-jdbc:3.13.10,net.snowflake:spark-snowflake_2.12:2.9.2-spark_3.1")

请注意,我已将 spark.jars.packages 与软件包一起使用,而不是 spark.jars 与 jar 的完整路径

【讨论】:

以上是关于如何正确设置 PySpark - Snowflake 连接的变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 map 函数正确并行运行 pyspark 代码

如何使用 pyspark 为非 pairwiseRDD 正确 groupByKey

如何在pyspark的JSON文件中选择正确的值

如何以正确的格式以科学记数法显示 PySpark 数据框中的列

如何使 pyspark 作业在多个节点上正确并行化并避免内存问题?

如何通过 pyspark 正确使用 rdd.map 中的模块