[英]How to Map with a case class in Scala
我正在嘗試轉換一個 Map 和我使用 Apply 定義的案例 class。
case class ETLConfig (srcTableName:Option[String] = None,
idCol:Option[String] = None ,
orderingCol:Option[String] = None)
object ETLConfig {
def apply(map: Map[String, String]): ETLConfig =
ETLConfig(map.get("srcTableName"),map.get("idCol"),map.get("orderCol"))
}
Error:
command-512604125416347:2: error: too many arguments for method apply: (map: Map[String,String])ETLConfig in object ETLConfig
def apply(map: Map[String, String]):ETLConfig = ETLConfig(map.get("srcTableName"),map.get("idCol"),map.get("orderCol"))
有人可以指出我在做什么錯嗎?
我也嘗試了以下方法並且正在工作。
val empMap:Map[String, String] = Map("srcTableName" -> "Employee","idCol" -> "EmpId", "orderCol" -> "CreatedOn" )
val empConfig = ETLConfig(dtMap.get("srcTableName"),dtMap.get("idCol"), dtMap.get("orderCol"))
val srcTable = dtConfig.srcTableName.orNull
編輯:由於您使用的是 Databricks,因此您應該在package 單元格中定義您的類和對象。
原答案:
我假設您在 REPL 中執行此操作。 案例 class 及其配套案例 object 需要在同一個文件中。 在通常的 Scala REPL 中,每個命令都算作一個新的“文件”。 這意味着您的ETLConfig
object 不是您的案例 class 的伴侶,因此它會影響您的應用方法而不是重載它(因此您不能調用原始方法)。
在官方的 Scala REPL 中,可以使用:paste
命令解決這個問題:
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class ETLConfig (srcTableName:Option[String] = None,
idCol:Option[String] = None ,
orderingCol:Option[String] = None)
object ETLConfig {
def apply(map: Map[String, String]): ETLConfig =
ETLConfig(map.get("srcTableName"),map.get("idCol"),map.get("orderCol"))
}
// Exiting paste mode, now interpreting.
defined class ETLConfig
defined object ETLConfig
從您的 output 看來,您使用的是不同的 REPL,所以我不知道這是否可行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.