1

在使用 sparkSql UDAF 函数时,我发现我的一些输入列意外地从 null 变为 0。

通过一些 REPL 实践,事实证明行为是 scala 2.10.5。

代码如下

import scala.collection.mutable

val wa = mutable.WrappedArray.make[Int](Array(null, null))

wa

wa(1)

您能否请有 scala 的家人帮助解释幕后发生的原因和情况?

4

1 回答 1

1

您调用make[Int]了声明如下的方法:

def make[T](x: AnyRef): WrappedArray[T] = (x match {
    case null              => null
    case x: Array[AnyRef]  => new ofRef[AnyRef](x)
    case x: Array[Int]     => new ofInt(x)
    case x: Array[Double]  => new ofDouble(x)
    case x: Array[Long]    => new ofLong(x)
    case x: Array[Float]   => new ofFloat(x)
    case x: Array[Char]    => new ofChar(x)
    case x: Array[Byte]    => new ofByte(x)
    case x: Array[Short]   => new ofShort(x)
    case x: Array[Boolean] => new ofBoolean(x)
    case x: Array[Unit]    => new ofUnit(x)
  }).asInstanceOf[WrappedArray[T]]

在您的情况下xArray(null, null)它是 的实例Array[AnyRef],因此make创建并返回ofRef[AnyRef]声明为的类的实例:

final class ofRef[T <: AnyRef](val array: Array[T]) extends WrappedArray[T] with Serializable {
  lazy val elemTag = ClassTag[T](arrayElementClass(array.getClass))
  def length: Int = array.length
  def apply(index: Int): T = array(index).asInstanceOf[T]
  def update(index: Int, elem: T) { array(index) = elem }
}

当你调用时wa(1),你调用apply这个类的方法,因为你的第二个元素是null它会返回0,因为null.asInstanceOf[Int]返回0

于 2018-06-12T18:13:14.543 回答