Sam*_*ker 13 scala apache-spark apache-spark-sql
以下代码段在Spark 2.2.1中运行正常,但在Spark 2.3.0中给出了一个相当神秘的运行时异常:
import sparkSession.implicits._
import org.apache.spark.sql.functions._
case class X(xid: Long, yid: Int)
case class Y(yid: Int, zid: Long)
case class Z(zid: Long, b: Boolean)
val xs = Seq(X(1L, 10)).toDS()
val ys = Seq(Y(10, 100L)).toDS()
val zs = Seq.empty[Z].toDS()
val j = xs
.join(ys, "yid")
.join(zs, Seq("zid"), "left")
.withColumn("BAM", when('b, "B").otherwise("NB"))
j.show()
Run Code Online (Sandbox Code Playgroud)
在Spark 2.2.1中,它打印到控制台
+---+---+---+----+---+
|zid|yid|xid| b|BAM|
+---+---+---+----+---+
|100| 10| 1|null| NB|
+---+---+---+----+---+
Run Code Online (Sandbox Code Playgroud)
在Spark 2.3.0中,它导致:
org.apache.spark.sql.catalyst.analysis.UnresolvedException: Invalid call to dataType on unresolved object, tree: 'BAM
at org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute.dataType(unresolved.scala:105)
at org.apache.spark.sql.types.StructType$$anonfun$fromAttributes$1.apply(StructType.scala:435)
at org.apache.spark.sql.types.StructType$$anonfun$fromAttributes$1.apply(StructType.scala:435)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.immutable.List.foreach(List.scala:392)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.immutable.List.map(List.scala:296)
at org.apache.spark.sql.types.StructType$.fromAttributes(StructType.scala:435)
at org.apache.spark.sql.catalyst.plans.QueryPlan.schema$lzycompute(QueryPlan.scala:157)
...
Run Code Online (Sandbox Code Playgroud)
真正的罪魁祸首似乎是Dataset空洞的Seq[Z].当你把它改成一个也会导致空的东西时,Dataset[Z]它就像在Spark 2.2.1中那样工作,例如
val zs = Seq(Z(10L, true)).toDS().filter('zid === 999L)
Run Code Online (Sandbox Code Playgroud)
在2.2到2.3的迁移指南中提到:
从Spark 2.3开始,如果可能的话,在第一个非确定性谓词之后的Join/Filter的确定性谓词也会向下推/通过子运算符.在之前的Spark版本中,这些过滤器不符合谓词下推条件.
这是相关的,还是(已知的)错误?
@user9613318 OP 创建了一个错误,但它被关闭为“无法重现”,因为开发人员说
我无法在当前母版上重现。这一定已经被修复了。
但没有提及另一个根本问题,因此这可能仍然是一个谜。
| 归档时间: |
|
| 查看次数: |
4583 次 |
| 最近记录: |