我正在尝试通过使用asInstanceof方法将字符串转换为scala type
,同时执行此操作时出现以下异常
java.lang.ClassCastException: java.lang.String cannot be cast to scala.Tuple2
我的代码如下
import org.apache.spark.sql.Column
import org.apache.spark.sql.functions.col
val cond : String = "(null, col(field).isNotNull)" // Will get this condition from properties file.
type mutliColumnType = (Column, Column)
def condition( value : String , field : String = "somefield") : mutliColumnType = {
value match {
case "a" => (null, col(field).isNull)
case _ => convertStringToMutliColumnType(cond) //cond.asInstanceOf[mutliColumnType]
}
}
condition("a") // returns data
condition("ab") // Exception
我们如何在这里将字符串转换为multiColumnType
?
更新:
目前,我在下面的代码段中编写了将字符串解析为mutliColumnType
的信息:
def convertStringToMutliColumnType(cond : String) : mutliColumnType = {
val colArray=cond.trim.substring(1, cond.length-1).split(",")
(col(colArray(0)), col(colArray(1)))
}
答案 0 :(得分:3)
您似乎想要asInstanceOf
将字符串评估为Scala代码。这与“ casting”实际上不是一回事,它不是asInstanceOf
所做的,并且实际上,将字符串作为代码来评估字符串并不是Scala所支持的(除了一些内部API和不建议使用的库,例如现在已经不存在的twitter-util-eval)。
目前还不清楚您要在这里做什么,但是您的选择基本上是编写一个接受字符串并返回mutliColumnType
值的解析器(这是很多工作,几乎可以肯定是个坏主意) ,或者只是不这样做-即在需要Scala代码的地方使用Scala代码,在需要字符串的地方使用字符串。
作为脚注:asInstanceOf
仅对向下转换非常有用(当您丢失类型信息并且键入了Any
时,您作为程序员“知道”的实际上是一个{{1 }}或其他任何东西,即使这样,它仍应被视为不安全且通常不是惯用的高级技术。每当您编写String
时,都是在告诉编译器,因为您了解得更多,所以请避开它们。以我的经验,您通常会出错。