使用共享案例类结构创建新案例类实例

时间:2017-01-22 05:21:56

标签: scala apache-spark

假设我已经定义了以下案例类:

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(喜欢案例类)

1 个答案:

答案 0 :(得分:3)

由于预期的用例是Spark SQL和DataFrame,因此不应该采用任何特殊方法。您可以通过添加列来将A转换为B

Seq(A(1, "foo")).toDS.withColumn("v3", lit(1.0)).as[B]

,从BA,仅as

Seq(B(2, "bar", 2.0)).toDS.as[A]