【问题标题】:how to access map of map based on inside map value in scala如何根据scala中的内部地图值访问地图地图
【发布时间】:2020-08-28 16:24:05
【问题描述】:

我有一张地图 src_grp_map 的地图。现在我想获取在内部地图的连接表键中具有模式字符串 edw.cdim_country 的内部地图。

下面是我的地图源图

      val src_grp_map=Map("edw.dim_cust_extn_odm" -> 
        Map("src_table" -> "edw.dim_cust_extn_odm", "tgt_attribute_count" -> 3, "join_table" -> "edw.dim_cust,edw.cdim_country,NA"),
        "edw.dw_atk_case_general" -> 
          Map("src_table" -> "edw.dw_atk_case_general", "tgt_attribute_count" -> 2, "join_table" -> "NA"))

现在使用 src_grp_map 我想要在 join_table 键中包含 edw.cdim_country 的地图 输出应该低于。

Map("src_table" -> "edw.dim_cust_extn_odm", "tgt_attribute_count" -> 3, "join_table" -> "edw.dim_cust,edw.cdim_country,NA")

如果多个内部映射包含模式字符串,那么我需要所有内部映射。

【问题讨论】:

  • 如果您正确地将代码格式化为代码,这可能会有所帮助。
  • @LuisMiguelMejíaSuárez 完成。谢谢
  • 请查阅 Scala 命名约定。 Scala 使用骆驼案例而不是蛇案例
  • 通过正确的格式,我指的不仅是更改字体,还包括拆分行以便更容易可视化数据。另外,src_map 的类型是什么?那些键是字符串吗?如果是这样,将它们放在引号中会有所帮助,因为我们可以复制和粘贴。
  • @LuisMiguelMejíaSuárez 我希望这会有所帮助,是的键是字符串类型。添加了引号。

标签: scala scala-collections


【解决方案1】:

这听起来是个有趣的问题。但是,我认为一件事会对您有很大帮助。目前,src_grp_map 的类型是 Map[String, Map[String, AnyVal]]。我认为将其设为 Map[String, CustomClass] 类型会更好。

所以这是我的首选解决方案:

case class TableInfo(srcTable: String, tgtAttributeCount: Int, joinTable: IndexedSeq[String])

val info1 = TableInfo("edw.dim_cust_extn_odm", 3, IndexedSeq("edw.dim_cust", "edw.cdim_country", "NA"))
val info2 = TableInfo("edw.dw_atk_case_general", 2, "NA")

val srcGrpMap = Map("edw.dim_cust_extn_odm" -> info1, "edw.dw_atk_case_general" -> info2)

def getTableInfo(joinTableKey: String, inputMap: Map[String, TableInfo]): IndexedSeq[TableInfo] = inputMap.values.filter(_.joinTable.contains(joinTableKey))

只需调用 getTableInfo 函数即可。

现在,如果您坚持使用原始笨重的数据格式,这里有一个替代解决方案:

def getTableInfo(joinTableKey: String, inputMap: Map[String, Map[String, AnyVal]]): IndexedSeq[Map[String, AnyVal]] = {
  inputMap.values.filter{ x =>
    x.get("join_table") match {
      case Some(y) =>
        y match {
          case z: String =>
            z.split(",").contains(joinTableKey)
          case z => false
        }
      case None => 
        false
    }
  }.toIndexedSeq
}

【讨论】:

    【解决方案2】:

    我已经设法使用下面的代码来实现它。

         val src_grp_map=Map("edw.dim_cust_extn_odm" ->
          Map("src_table" -> "edw.dim_cust_extn_odm", "tgt_attribute_count" -> 3, "join_table" -> "edw.dim_cust,edw.cdim_country,NA"),
          "edw.dw_atk_case_general" ->
            Map("src_table" -> "edw.dw_atk_case_general", "tgt_attribute_count" -> 2, "join_table" -> "NA"))
    
        val collect_src_table_values=src_grp_map.map(p=>p._2).toList
    
        val z=collect_src_table_values.filter(x=>x("join_table").toString().contains("edw.cdim_country"))
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2023-04-10
      • 2022-01-09
      • 2011-03-16
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多