使用伴随对象进行Scala提取/模式匹配

时间:2015-06-10 17:11:49

标签: scala apache-spark-sql

以下代码取自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)
}

我真的不明白如何为伴侣类做同样的事情

1 个答案:

答案 0 :(得分:0)

我从未与Spark合作过,所以我无法回答具体的Spark知识。

但是您的示例中的模式匹配似乎是基于普通类型的模式匹配。

castTypeDataType类型的一个实例,它有几个子类,例如ByteType。模式匹配仅测试castType对象是否属于特定类(例如ByteType)。

因为只有几个子类型的单例实例,所以匹配不需要提供匹配实例。这就是为什么匹配只使用占位符_