【问题标题】:How to use match case pattern in Spark2 Scala如何在 Spark2 Scala 中使用匹配大小写模式
【发布时间】:2019-11-25 02:00:44
【问题描述】:

我想在 scala 中使用大小写匹配来定义字符串列表。这是我的代码:

Parametre_mod.targetTableBase match {
              case "DWG_LD_ANOMALIE" => 
                val champs = List("CD_ANOMALIE",
                    "CD_FAMILLE",
                    "LIB_ANOMALIE",
                    "DT_MAJ",
                    "CLASSIFICATION",
                    "NB_REJEUX",
                    "TOP_INDIC_CD_ERREUR", "TOP_COORDONNEE_INVALIDE", "TOP_SUPP", "DT_SUPP")

              case "DWG_LD_NOTIFICATION" =>
                val champs = List(
                    "ID_NOTIFICATION", "ID_ENTITE", "ID_ENTITE_GARANTE", "CD_SYS_APPELANT", "CD_TYPE_DESTINATAIRE", "ID_PERSONNE", "EMAIL_DESTINATAIRE", 
                    "NUM_TEL_DESTINATAIRE", "CD_TYPE_EVENEMENT", "CD_TYPE_NOTIFICATION", "CD_TYPE_DEST_SOURCE", "ID_PERSONNE_DEST_SOURCE", "REF_EXT_DEST_SOURCE", 
                    "EMAIL_DEST_SOURCE", "NUM_TEL_DEST_SOURCE", "ID_PERSONNE_DEST_SOURCE_2", "NB_REJEUX", "TOP_RECYCLAGE", "ID_DOC_STRATEGIE_EDIT", "TOP_SUPP", "DT_SUPP")
            }

            insertion(df, champs, cstProp)

但 Eclipse IDE 表明插入函数中的字段 champs 未定义。请问我怎样才能做到这一点?

【问题讨论】:

    标签: scala apache-spark pattern-matching


    【解决方案1】:

    您在match 表达式中创建的champs 的范围。并且它不能在它之外访问。

    您可以分配给champs,如下所示

    val champs = Parametre_mod.targetTableBase match {
      case "DWG_LD_ANOMALIE" => List("CD_ANOMALIE",
          "CD_FAMILLE",
          "LIB_ANOMALIE",
          "DT_MAJ",
          "CLASSIFICATION",
          "NB_REJEUX",
          "TOP_INDIC_CD_ERREUR", "TOP_COORDONNEE_INVALIDE", "TOP_SUPP", "DT_SUPP")
      case "DWG_LD_NOTIFICATION" => List(
          "ID_NOTIFICATION", "ID_ENTITE", "ID_ENTITE_GARANTE", "CD_SYS_APPELANT", "CD_TYPE_DESTINATAIRE", "ID_PERSONNE", "EMAIL_DESTINATAIRE",
          "NUM_TEL_DESTINATAIRE", "CD_TYPE_EVENEMENT", "CD_TYPE_NOTIFICATION", "CD_TYPE_DEST_SOURCE", "ID_PERSONNE_DEST_SOURCE", "REF_EXT_DEST_SOURCE",
          "EMAIL_DEST_SOURCE", "NUM_TEL_DEST_SOURCE", "ID_PERSONNE_DEST_SOURCE_2", "NB_REJEUX", "TOP_RECYCLAGE", "ID_DOC_STRATEGIE_EDIT", "TOP_SUPP", "DT_SUPP")
    }
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您需要在匹配块之外定义“冠军”,以便它在外部也可用 -

      var champs:List[String] = List.empty[String]
      
          Parametre_mod.targetTableBase match {
            case "DWG_LD_ANOMALIE" =>
              champs = List("CD_ANOMALIE",
                "CD_FAMILLE",
                "LIB_ANOMALIE",
                "DT_MAJ",
                "CLASSIFICATION",
                "NB_REJEUX",
                "TOP_INDIC_CD_ERREUR", "TOP_COORDONNEE_INVALIDE", "TOP_SUPP", "DT_SUPP")
      
            case "DWG_LD_NOTIFICATION" =>
              champs = List(
                "ID_NOTIFICATION", "ID_ENTITE", "ID_ENTITE_GARANTE", "CD_SYS_APPELANT", "CD_TYPE_DESTINATAIRE", "ID_PERSONNE", "EMAIL_DESTINATAIRE",
                "NUM_TEL_DESTINATAIRE", "CD_TYPE_EVENEMENT", "CD_TYPE_NOTIFICATION", "CD_TYPE_DEST_SOURCE", "ID_PERSONNE_DEST_SOURCE", "REF_EXT_DEST_SOURCE",
                "EMAIL_DEST_SOURCE", "NUM_TEL_DEST_SOURCE", "ID_PERSONNE_DEST_SOURCE_2", "NB_REJEUX", "TOP_RECYCLAGE", "ID_DOC_STRATEGIE_EDIT", "TOP_SUPP", "DT_SUPP")
          }
          insertion(df, champs, cstProp)
      

      【讨论】:

      • 这将是 Scala 中的反模式,因为您使用的是 unnecessary var,因为 match表达式 可以返回一个值。
      • 感谢路易斯的建议。
      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2016-07-03
      • 2013-01-14
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多