如何选择一个 case class
基于 String
价值?
我的密码是
val spark = SparkSession.builder()...
val rddOfJsonStrings: RDD[String] = // some json strings as RDD
val classSelector: String = ??? // could be "Foo" or "Bar", or any other String value
case class Foo(foo: String)
case class Bar(bar: String)
if (classSelector == "Foo") {
val df: DataFrame = spark.read.json(rddOfJsonStrings)
df.as[Foo]
} else if (classSelector == "Bar") {
val df: DataFrame = spark.read.json(rddOfJsonStrings)
df.as[Bar]
} else {
throw ClassUnknownException //custom Exception
}
变量 classSeletector
是一个简单字符串,应用于指向同名的case类。
想象一下我不仅仅有 Foo
以及 Bar
作为案例类,但不止这两个。怎么可能叫警察 df.as[]
基于字符串的语句(如果可能的话)?
或者在scala中有完全不同的方法吗?
4条答案
按热度按时间jucafojl1#
备选方案-
亮点-
使用
simpleName
是case类的,而不是伴随对象的如果
classSelector
是null
,解决方案不会失败测试用例-
yh2wf1be2#
定义一个泛型方法并调用它,
frebpwbc3#
检查以下代码
vdzxcuhz4#
如何基于字符串调用df.as[]语句(如果可能的话)?
它不是(或者基于任何运行时值)。您可能会注意到,所有答案仍然需要:
有一个单独的分支机构
Foo
以及Bar
(并且为您要添加的每个类再添加一个分支);在分支中重复类名两次。
您可以避免第二种情况:
但首先,如果可能的话,你需要一个宏。我猜不是。