Преобразовать строку в параметризованный тип в Scala - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь преобразовать строку в scala type с помощью метода asInstanceof, при этом я получаю ниже исключения 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)))
}

1 Ответ

0 голосов
/ 01 марта 2019

Вы, похоже, хотите, чтобы asInstanceOf оценил строку как код Scala.На самом деле это не то же самое, что «приведение», это не то, что делает asInstanceOf, и на самом деле оценка строк как кода - это совсем не то, что поддерживает Scala (за исключением некоторых внутренних API и необоснованных библиотек, таких как сейчас).defunct twitter-util-eval).

Совершенно неясно, что вы пытаетесь сделать здесь, но в основном вы можете либо написать парсер, который принимает строки и возвращает mutliColumnType значений (что очень многоработы и почти наверняка плохая идея), или просто не делать этого - то есть использовать код Scala, где вам нужен код Scala, и строки, где вам нужны строки.

В качестве сноски: asInstanceOf только на самом делеполезно для даункинга (когда вы потеряли информацию о типе и набрали что-то типа Any, которое вы, как программист "знаете", на самом деле String или что-то в этом роде), и даже в этом случае это следует считать передовой техникой, которая небезопасна ине вообще идиоматический.Каждый раз, когда вы пишете asInstanceOf, вы говорите компилятору убираться с дороги, потому что вы знаете лучше, и по моему опыту вы, как правило, ошибаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...