使用PySpark时遇Py4JJavaError: scala/Product$class类未找到问题求助
Spark读取SAS文件时Scala版本不兼容错误解决
问题详情
运行代码
import pandas as pd from pyspark.sql import SparkSession spark = SparkSession.builder.\ config("spark.jars.repositories", "https://repos.spark-packages.org/").\ config("spark.jars.packages", "saurfang:spark-sas7bdat:2.0.0-s_2.11,org.apache.hadoop:hadoop-aws:2.7.0").\ enableHiveSupport().getOrCreate() df_spark_temp = spark.read.format('com.github.saurfang.sas.spark').load('18-83510-I94-Data-2016/i94_apr16_sub.sas7bdat') df_spark_temp.limit(5).toPandas().show()
报错信息
py4j.protocol.Py4JJavaError: An error occurred while calling o34.load. : java.lang.NoClassDefFoundError: scala/Product$class at com.github.saurfang.sas.spark.SasRelation.<init>(SasRelation.scala:48) at com.github.saurfang.sas.spark.SasRelation$.apply(SasRelation.scala:42) at com.github.saurfang.sas.spark.DefaultSource.createRelation(DefaultSource.scala:50) at com.github.saurfang.sas.spark.DefaultSource.createRelation(DefaultSource.scala:39) at com.github.saurfang.sas.spark.DefaultSource.createRelation(DefaultSource.scala:27) at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:350) at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:228) at org.apache.spark.sql.DataFrameReader.$anonfun$load$2(DataFrameReader.scala:210) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:210) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:185) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) at py4j.Gateway.invoke(Gateway.java:282) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182) at py4j.ClientServerConnection.run(ClientServerConnection.java:106) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.ClassNotFoundException: scala.Product$class at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 23 more
环境信息
- Python版本:3.9.6
- JAVA版本:17.0.4.1
- PySpark版本:3.3.0
pyspark --version输出:
____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 3.3.0 /_/ Using Scala version 2.12.15, Java HotSpot(TM) 64-Bit Server VM, 17.0.4.1
用户疑问
- 是否需要单独安装Scala,还是通过JAVA设置解决?
pyspark --version显示的Scala版本是否意味着已安装?
解决方案
关于Scala安装的说明
PySpark自带完整的Scala运行环境,pyspark --version显示的Scala 2.12.15是PySpark内置的,不需要单独安装Scala。
报错核心原因
你指定的SAS读取包saurfang:spark-sas7bdat:2.0.0-s_2.11是针对Scala 2.11编译的,而你的PySpark使用的是Scala 2.12,版本不匹配导致JVM找不到对应的Scala类(scala.Product$class)。
具体修复步骤
- 更换兼容的spark-sas7bdat版本:选择适配Scala 2.12和Spark 3.x的版本,比如
3.0.0-s_2.12 - 更新hadoop-aws版本:Spark 3.3建议搭配
hadoop-aws:3.3.1,避免版本冲突 - 修正代码错误:Pandas DataFrame没有
show()方法,改用Spark原生的show()或者打印Pandas DataFrame
修改后的代码
import pandas as pd from pyspark.sql import SparkSession spark = SparkSession.builder.\ config("spark.jars.repositories", "https://repos.spark-packages.org/").\ config("spark.jars.packages", "saurfang:spark-sas7bdat:3.0.0-s_2.12,org.apache.hadoop:hadoop-aws:3.3.1").\ enableHiveSupport().getOrCreate() df_spark_temp = spark.read.format('com.github.saurfang.sas.spark').load('18-83510-I94-Data-2016/i94_apr16_sub.sas7bdat') # 方案1:用Spark原生show方法 df_spark_temp.limit(5).show() # 方案2:转Pandas后打印 # print(df_spark_temp.limit(5).toPandas())
内容的提问来源于stack exchange,提问作者Peter Liu
相关产品推荐
相关产品推荐

