PySpark读取Snowflake/MSSQL数据时遇scala/$less$colon$less类缺失错误求助
解决PySpark读取Snowflake时的
scala.$less$colon$less类找不到错误 尝试使用PySpark创建DataFrame读取Snowflake和MSSQL数据时,遇到如下错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o36.load. : java.lang.NoClassDefFoundError: scala/$less$colon$less at net.snowflake.spark.snowflake.DefaultSource.shortName(DefaultSource.scala:44) ... Caused by: java.lang.ClassNotFoundException: scala.$less$colon$less ...
核心原因
该错误本质是Snowflake Spark连接器与当前PySpark环境的Scala版本不兼容,或缺失必要的依赖包。scala.$less$colon$less对应Scala的::操作符类,当依赖的Scala版本和Spark运行环境不一致时,就会出现类找不到的问题。
解决步骤
1. 确认Scala版本匹配
- 先查看PySpark对应的Scala版本:
输出中会显示Scala版本,比如pyspark --versionScala version 2.12.15, Java HotSpot(TM) 64-Bit Server VM, 1.8.0_371 - 选择与Spark、Scala版本完全匹配的Snowflake连接器:
- Spark 3.x通常搭配Scala 2.12,Spark 2.x搭配Scala 2.11
- 连接器命名规则:
spark-snowflake_<scala_version>:<connector_version>-spark_<spark_version>,例如spark-snowflake_2.12:2.12.0-spark_3.3
2. 正确加载依赖包
方式一:启动PySpark时指定依赖
直接在启动命令中通过--packages参数加载正确的Snowflake和MSSQL依赖:
# 示例:Spark 3.3 + Scala 2.12 pyspark --packages \ net.snowflake:snowflake-jdbc:3.13.30, \ net.snowflake:spark-snowflake_2.12:2.12.0-spark_3.3, \ com.microsoft.sqlserver:mssql-jdbc:12.4.1.jre8
方式二:在SparkSession中配置依赖
如果使用Jupyter Notebook或代码脚本,在创建SparkSession时添加依赖配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("SnowflakeMSSQLReader") \ .config("spark.jars.packages", "net.snowflake:snowflake-jdbc:3.13.30," "net.snowflake:spark-snowflake_2.12:2.12.0-spark_3.3," "com.microsoft.sqlserver:mssql-jdbc:12.4.1.jre8") \ .getOrCreate()
3. 清理旧依赖缓存
如果之前下载过不兼容的依赖包,清理本地缓存避免干扰:
- 清理Ivy缓存:删除
~/.ivy2/cache/net.snowflake目录 - 清理Maven缓存:删除
~/.m2/repository/net/snowflake目录
4. 验证连接
编写简单测试代码验证Snowflake连接是否正常:
# Snowflake连接配置 sf_config = { "sfURL": "your_account.snowflakecomputing.com", "sfUser": "your_username", "sfPassword": "your_password", "sfDatabase": "target_db", "sfSchema": "target_schema", "sfWarehouse": "target_warehouse" } # 读取Snowflake数据 df_snowflake = spark.read.format("snowflake").options(**sf_config).option("dbtable", "your_table").load() df_snowflake.show(5) # MSSQL读取示例(供参考) mssql_config = { "url": "jdbc:sqlserver://your_mssql_host:1433;databaseName=target_db;", "dbtable": "your_mssql_table", "user": "mssql_user", "password": "mssql_password", "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver" } df_mssql = spark.read.format("jdbc").options(**mssql_config).load() df_mssql.show(5)
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

