scala—从case类中获取所有实体并将它们转换为字符串

8ehkhllq  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(336)

我有一个案例类如下:

case class Class1(field1: String,
                  field2: Option[String] = None,
                  var var1: Option[String] = None,
                  var var2: Option[Boolean] = None,
                  var var3: Option[Double] = None
)

变量列表要长一点。现在我想把类中的所有变量转换成一个字符串。说 Option[] 必须省略并且 Boolean , Double 以及 Number 必须转换为字符串类型。我的第一个方法是:

def anyOptionalToString(class1Dataset: Dataset[Class1]): DataFrame = {
    val ds1 = class1Dataset.map { class1 =>
        (
          class1.field1,
          class1.field2.getOrElse(""),
          class1.var1.getOrElse(""),
          class1.var2.getOrElse(false),
          class1.var3.getOrElse(-1.0)
        )
 }

有没有一种方法可以在不调用每个领域的情况下使用它们?用一种 loop 或者类似的?

pwuypxnk

pwuypxnk1#

我要做的是创造一个新的 Seq 包含您想要的默认值。比如说:

val defaults = Seq("", "", "", false, -1)

现在,我们可以使用 productIterator 要迭代现有元素,并选择是使用现有值还是默认值:

val c1 = Class1("f1", Some("f2"), None, Some(true), Some(3))
c1.productIterator.zip(defaults.iterator).map {
  case (None, default) => default
  case (Some(value), _) => value
  case (value, _) => value
}.map(_.toString)

上面代码的结果类型是 Iterator[String] . 代码运行可以在scastie上找到。

相关问题