PySpark中FP Growth(频繁模式挖掘)执行.fit()报错的解决方法
解决Spark 2.3.0 + Java 9下FP Growth的fit()方法报错问题
问题背景
你运行的是Spark官方的FP Growth示例代码:
from pyspark.ml.fpm import FPGrowth df = spark.createDataFrame([(0, [1, 2, 5]),(1, [1, 2, 3, 5]),(2, [1, 2])], ["id", "items"]) fpGrowth = FPGrowth(itemsCol="items", minSupport=0.5, minConfidence=0.6) model = fpGrowth.fit(df) model.freqItemsets.show()
但调用fit()时抛出了包含java.lang.IllegalArgumentException的栈错误,核心触发点是org.apache.xbean.asm5.ClassReader无法正常处理字节码。
你的环境配置:
- Spark 2.3.0
- Java 9
问题根源
Spark 2.3.0的开发周期早于Java 9正式发布,官方并未对Java 9提供支持。它依赖的ASM库版本(asm5)仅能解析Java 8及以下版本的字节码,而Java 9引入了新的字节码格式与模块系统,导致Spark的ClosureCleaner(用于清理闭包的核心工具)在解析类文件时直接报错。
解决方案
方案1:降级Java到Spark 2.3.0支持的版本(推荐)
Spark 2.x系列的官方推荐运行环境是Java 8,这是最稳定、兼容性最好的选择:
- 安装Java 8 JDK/JRE
- 修改系统环境变量,将
JAVA_HOME指向Java 8的安装路径 - 重启Spark会话或开发工具,重新运行代码
切换后,示例代码应该能正常输出频繁项集:
+---------+----+ | items|freq| +---------+----+ | [1]| 3| | [2]| 3| | [1, 2]| 3| | [5]| 2| | [1, 5]| 2| | [2, 5]| 2| |[1, 2, 5]| 2| +---------+----+
方案2:升级Spark版本到支持Java 9的版本
如果你必须使用Java 9,可以升级Spark到2.4.0及以上版本(Spark 2.4开始有限支持Java 9)。不过需要注意:
- Spark 2.4对Java 9的支持存在部分限制,部分边缘功能可能有兼容性问题
- 若想获得更完善的Java 9+支持,建议直接升级到Spark 3.x系列,但需要确认业务代码是否兼容Spark 3.x的API变化
内容的提问来源于stack exchange,提问作者Jerry George
相关产品推荐
相关产品推荐

