我已经阅读了其他相关问题,但我没有得到答案。
代码:
inputType.zip(inputColName).zipWithIndex.map {
case (inputType, inputColName, idx) =>
inputType match {
case **DoubleType** => println("test1")
case _ => println('test2 ')
}
}
DoubleType
模式类型与预期类型不兼容。找到DoubleType.type。必需:(DataType,String)。
我尝试了两个简化版本,语法看起来正确。
List(1,2,3).zip(List(4,5,6)).map { case(a, b) =>
a match {case 1 => println(s"First is $a, second is $b")
case _ => println("test")}}
以下也适用
inputType.zipWithIndex.map {
case (inputType, idx) =>
inputType match {
case DoubleType => println("test1")
case _ => println('test2 ')
}
}
我不明白为什么在添加zip
之后,为什么我有这种模式匹配类型错误。
答案 0 :(得分:5)
您错过了群组 inputType
和inputColName
tuple2
inputType.zip(inputColName).zipWithIndex.map {
case ((inputType, inputColName), idx) =>
inputType match {
case DoubleType => println("test1")
case _ => println("test2")
}
}
当您使用zip
作为
inputType.zip(inputColName)
然后 Scala编译器会将其视为
List[(org.apache.spark.sql.types.NumericType with Product with Serializable, String)]
当你添加.zipWithIndex
时, Scala编译器将把它读作
List[((org.apache.spark.sql.types.NumericType with Product with Serializable, String), Int)]
问题
当您将案例定义为case(inputType, inputColName, idx)
时, Scala编译器会将inputType
视为(org.apache.spark.sql.types.NumericType with Product with Serializable, String)
和inputColName
为您创建Int
时形成的((org.apache.spark.sql.types.NumericType with Product with Serializable, String), Int)
dataTypes inputType.zip(inputColName).zipWithIndex
。所以永远不会发现idx
。
即使您在没有idx
的情况下执行以下操作,也有效(现在inputType
的{{1}}被视为case
)
(org.apache.spark.sql.types.NumericType with Product with Serializable, String)
我希望解释清楚。