在Databricks中使用pysparkling创建H2OContext失败报错
java.lang.NoSuchFieldError: quasibinomial错误 你遇到的这个错误是典型的版本不兼容问题,具体来说是你安装的h2o_pysparkling_2.1和h2o-genmodel.jar版本不匹配,或者和你的Spark 2.1环境不兼容导致的。quasibinomial是H2O内部枚举类中的一个字段,当依赖库版本不一致时,就会出现找不到这个字段的情况。
下面是具体的解决方案步骤:
1. 确认版本匹配规则
Sparkling Water(也就是h2o_pysparkling)的版本必须和你的Spark版本严格对应,同时H2O的核心库(包括h2o-genmodel.jar)版本必须和Sparkling Water完全一致。对于你的Spark 2.1(Scala 2.11)环境,你需要使用适配Spark 2.1的Sparkling Water稳定版本,比如h2o-pysparkling-2.1-3.10.0.1-1-2.1。
2. 清理不兼容的现有库
登录Databricks控制台,进入你的集群页面,找到“库”标签页:
- 移除当前已添加的
h2o-genmodel.jar(如果它的版本和h2o_pysparkling_2.1不一致) - 确认
h2o_pysparkling_2.1的版本是否正确,如果版本不对也一并移除
3. 添加匹配版本的库
在集群的“库”页面点击“安装新库”,分别添加以下两个库:
- PySparkling库:选择“PyPI”源,输入包名
h2o_pysparkling_2.1,指定版本为3.10.0.1-1-2.1 - H2O GenModel库:选择“Maven”源,输入坐标
ai.h2o:h2o-genmodel:3.10.0.1-1-2.1,确保版本和PySparkling完全一致
4. 重启集群
添加完库后,必须重启你的Databricks集群,确保新的依赖库完全加载生效。
5. 重新验证代码
集群重启后,重新运行你的代码:
from pysparkling import * import h2o h2oConf = H2OConf(spark) h2oConf.set("spark.ui.enabled", True) h2oContext = H2OContext.getOrCreate(spark, h2oConf)
这样应该就能成功创建H2OContext,不会再出现NoSuchFieldError了。
补充说明
这个错误的根源是:Sparkling Water在运行时会依赖H2O的核心类,当h2o-genmodel.jar的版本比Sparkling Water预期的H2O版本旧,就会缺少quasibinomial这个枚举值,导致Java反射调用时抛出找不到字段的异常。严格保证版本匹配是解决这类问题的核心。
内容的提问来源于stack exchange,提问作者Marvania Mehul

