如何使用Map实例创建Scala案例类实例

时间:2018-05-17 04:05:30

标签: scala apache-spark apache-spark-sql

我想创建一个scala案例类,其字段来自地图。而且,这是案例类

 case class UserFeature(uid: String = null,
                     age: String = null,
                     marriageStatus: String = null,
                     consumptionAbility: String = null,
                     LBS: String = null,
                     interest1: String = null,
                     interest2: String = null,
                     interest3: String = null,
                     interest4: String = null,
                     interest5: String = null,
                     kw1: String = null,
                     kw2: String = null,
                     kw3: String = null,
                     topic1: String = null,
                     topic2: String = null,
                     topic3: String = null,
                     appIdInstall: String = null,
                     appIdAction: String = null,
                     ct: String = null,
                     os: String = null,
                     carrier: String = null,
                     house: String = null
                          )

假设地图实例是

Map("uid" -> "4564131",
    "age" -> "5",
    "ct" -> "bk7755")

如何将地图的键和值应用于案例类的字段和值?

3 个答案:

答案 0 :(得分:1)

您可以UserFeature(uid = map_var("uid"), age = map_var("age"), ct = map_var("ct"))假设持有Map的变量为map_var并且密钥可用

答案 1 :(得分:1)

使用null表示缺少的字符串值不是一个好主意。请改用Option[String]

case class UserFeature(uid: Option[String] = None,
                       age: Option[String] = None,
                       marriageStatus: Option[String] = None,
                       ...

完成后,您可以在地图上使用get来检索值。

UserFeature(map.get("uid"), map.get("age"), map.get("marriageStatus") ...)

地图中显示的值为Some(value),缺失值为NoneOption类有许多有用的方法可以安全地处理可选值。

答案 2 :(得分:1)

综合其他两个答案,我会将String中您默认为UserFeature的所有null转换为Option[String](除非与糟糕的交互,否则您基本上不应该在Scala中使用写入的Java代码需要它,甚至可以尽可能少地使用它来object UserFeature { def apply(map: Map[String, String]): UserFeature = UserFeature(map.get("uid"), map.get("age") ...) } 。我离开了搜索和替换答案。

然后你可以这样做:

val someMap: Map[String, String] = ...
val userFeature = UserFeature(someMap)

允许您使用:

Option[String]

如果更改为BUG: scheduling while atomic,则需要在代码库中进行一些其他更改。 https://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html是如何处理Option的好教程。