Spark读取Ignite DataFrame执行SQL时遇NoClassDefFoundError(IfNull)问题求助
Spark与Ignite集成SQL查询报错解决方案
问题场景
我将Spark DataFrame写入Ignite的代码如下:
spark_df.write.format("ignite") .mode("overwrite") .option("table", "processed_logs") .option("primaryKeyFields","player_id") .option("config",config_file).save()
随后将数据读入DataFrame:
ignite_df = spark.read.format("ignite") .option("table", "processed_logs") .option("config", config_file) .load()
接着创建临时视图:
ignite_df.createOrReplaceTempView("ignite_table")
执行SQL查询 spark.sql("Select * from ignite_table where logins > 2").show() 时触发错误,报错信息:
Py4JJavaError: An error occurred while calling o197.showString. : java.lang.NoClassDefFoundError: org/apache/spark/sql/catalyst/expressions/IfNull at org.apache.ignite.spark.impl.optimization.SystemExpressions$.apply(SystemExpressions.scala:35) at org.apache.ignite.spark.impl.optimization.package$.$anonfun$exprsAllowed$2(package.scala:100)
环境信息
- Spark版本:3.3.2
- Ignite版本:2.15.0
- Python瘦客户端查询可正常运行,但需解决当前Spark SQL方案的报错问题
解决方案
问题根源
Ignite 2.15.0的Spark集成组件与Spark 3.3.2存在API兼容冲突:org.apache.spark.sql.catalyst.expressions.IfNull 在Spark 3.0+版本中已被废弃/移除,但Ignite的查询优化逻辑仍在调用该类,导致类找不到错误。
可行解决办法
禁用Ignite查询优化
在读取Ignite数据时添加配置关闭优化逻辑,绕过对过时API的调用,修改后读取代码:ignite_df = spark.read.format("ignite") .option("table", "processed_logs") .option("config", config_file) .option("spark.ignite.optimization.enabled", "false") .load()降级Spark版本
将Spark版本降级至Ignite 2.15.0官方兼容的版本(如Spark 3.1.x系列),消除API版本不匹配问题。升级Ignite版本
升级Ignite至2.16.0及以上版本,该版本已修复与Spark 3.3.x的兼容性问题,适配了Spark新版本的API规范。
内容的提问来源于stack exchange,提问作者Arunima Barik
相关产品推荐
相关产品推荐

