Scala 从case类中获取所有实体并将其转换为字符串
我有一个案例类,如下所示:Scala 从case类中获取所有实体并将其转换为字符串,scala,apache-spark,Scala,Apache Spark,我有一个案例类,如下所示: 案例类Class1(字段1:字符串, 字段2:选项[字符串]=无, var var1:选项[字符串]=无, var var2:选项[布尔]=无, var var3:选项[Double]=无 ) 变量列表稍微长一点。现在我想将类中的所有变量转换为字符串。Say选项[]必须省略,而且布尔值、双精度和数字必须转换为字符串类型。我的第一个方法是: def anyOptionalToString(class1Dataset: Dataset[Class1]): DataFra
案例类Class1(字段1:字符串,
字段2:选项[字符串]=无,
var var1:选项[字符串]=无,
var var2:选项[布尔]=无,
var var3:选项[Double]=无
)
变量列表稍微长一点。现在我想将类中的所有变量转换为字符串。Say选项[]
必须省略,而且布尔值
、双精度
和数字
必须转换为字符串类型。我的第一个方法是:
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)
)
}
有没有一种方法可以在不调用每个字段的情况下使用它们?
以一种
循环
或类似的方式说话?我要做的是创建一个新的序列
,其中包含您想要的默认值。比如说:
val defaults = Seq("", "", "", false, -1)
现在,我们可以使用来迭代现有元素,并选择是使用现有值还是默认值:
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)
上面代码的结果类型是
迭代器[String]
。代码运行可在。查找模式匹配?您也可以简单地在case类上执行toString。有点不清楚你想做什么。也许您最好添加更多代码和这些转换的结果?。如果您需要将异构类型的值收集到一个新类型中,您将需要类似于HList的内容,这是一个高级主题。嘿,谢谢您的快速响应,很抱歉我的错误描述。我主要想封装case类,并创建一个新的构造,其中包含与string相同的字段。我已经改变了上面的描述,希望我能表达得更清楚一点。新的构造是另一个Specific T类型?,例如,一个新的case类?