【问题标题】:How to create a scala case class instance with a Map instance如何使用 Map 实例创建 scala 案例类实例
【发布时间】:2018-05-17 04:05:29
【问题描述】:

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

 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")

如何将映射的键和值应用到案例类的字段和值?

【问题讨论】:

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


【解决方案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 类有很多有用的方法可以安全地处理可选值。

【讨论】:

  • 感谢您对 Option[String] 的精彩解释,您有 github 或者我可以帮忙的吗?
  • @SteveYN 很乐意提供帮助,但我没有 github 或类似的东西。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答,但是,我认为 map_var("ct") 可能会给出字段“marriageStatus”的值是否正确?
  • 这只是提取价值。您可以将它与其他参数一起传递到需要的任何位置,如果不需要,则可以不使用它
  • 类如何知道map_var("ct")中的值是字段"ct"的值
  • 这是从键中提取值。 map_var(''ct) 将返回“bk7755”。如果不需要,您可以不使用它
  • 类如何知道“bk7755”是字段“ct”而不是字段“marriageStatus”的值。而且,编译器是否按顺序解析参数?
【解决方案3】:

综合其他两个答案,我会将 UserFeature 中的所有 Strings 转换为您默认为 null (除非与编写不佳的 Java 代码交互需要它,否则您基本上不应该在 Scala 中使用它,甚至尽可能少地使用它)到Option[String]。我将搜索和替换排除在答案之外。

那么你可以这样做:

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] 的更改,您的代码库中还需要进行一些其他更改。 https://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html 是一个很好的关于如何处理 Option 的教程。

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多