以下代码取自Spark SQL。它执行提取,但castType
是一个伴随对象 - 可以将其称为TypeCast.castTo("abc", StringType)
。
有人可以解释模式匹配如何与引擎盖下的伴随对象一起工作?
private[csv] def castTo(datum: String, castType: DataType): Any = {
castType match {
case _: ByteType => datum.toByte
case _: ShortType => datum.toShort
case _: IntegerType => datum.toInt
case _: LongType => datum.toLong
case _: FloatType => datum.toFloat
case _: DoubleType => datum.toDouble
case _: BooleanType => datum.toBoolean
case _: DecimalType => new BigDecimal(datum.replaceAll(",", ""))
case _: TimestampType => Timestamp.valueOf(datum)
case _: DateType => Date.valueOf(datum)
case _: StringType => datum
case _ => throw new RuntimeException(s"Unsupported type: ${castType.typeName}")
}
}
增加: 根据我的理解,extractin / pattern匹配通常由伴随对象的unapply方法实现。这是案例类implemented under the hood
的示例 trait User {
def name: String
}
class FreeUser(val name: String) extends User
class PremiumUser(val name: String) extends User
object FreeUser {
def unapply(user: FreeUser): Option[String] = Some(user.name)
}
object PremiumUser {
def unapply(user: PremiumUser): Option[String] = Some(user.name)
}
我真的不明白如何为伴侣类做同样的事情
答案 0 :(得分:0)
我从未与Spark合作过,所以我无法回答具体的Spark知识。
但是您的示例中的模式匹配似乎是基于普通类型的模式匹配。
castType
是DataType
类型的一个实例,它有几个子类,例如ByteType
。模式匹配仅测试castType
对象是否属于特定类(例如ByteType
)。
因为只有几个子类型的单例实例,所以匹配不需要提供匹配实例。这就是为什么匹配只使用占位符_
。