假设我已经定义了以下案例类:
scala> case class A(v1: Int, v2: String)
defined class A
scala> case class B(v1: Int, v2: String, v3: Double)
defined class B
注意他们如何分享前两个参数。
现在假设我有一些返回A
的进程。在一种情况下,我会直接使用A
,而在另一种情况下,我想使用A
来制作B
(在提供第三个参数之后)。
我可以通过以下方法完成此任务:
scala> def mkBFromA(a: A, v3: Double): B = B(a.v1, a.v2, v3)
mkBFromA: (a: A, v3: Double)B
scala> mkBFromA(A(1, "t"), 3.14)
res0: B = B(1,t,3.14)
但是我不喜欢如何复制所有参数。
有更好的方法吗?
我正在使用案例类,因为这将用于制作Apache Spark DataFrame
(喜欢案例类)
答案 0 :(得分:3)
由于预期的用例是Spark SQL和DataFrame
,因此不应该采用任何特殊方法。您可以通过添加列来将A
转换为B
:
Seq(A(1, "foo")).toDS.withColumn("v3", lit(1.0)).as[B]
,从B
到A
,仅as
:
Seq(B(2, "bar", 2.0)).toDS.as[A]