使用 scala case class 创建一个 JSON 对象
Create a JSON object using the scala case class
我有如下所示的 JSON 文件,我的 Scala 程序必须将此 JSON 文件作为 args(0)
读取,对于 args(1)
我将通过CUSTOMER_VEHICLE 作为参数。根据传递的 args(1)
参数,程序必须获取相应的 staginDir 路径,rawLayerTbl(table name)
,fileDelimiter 作为三个独立的变量。
创建了一个案例 class 并尝试创建与案例 class 匹配的 JSON 对象,但运气不好,有没有使用 scala 实现此目的的简单方法。我需要在 Databricks 运行时版本 6.3(包括 Apache Spark 2.4.4、Scala 2.11)上执行此操作。
rawSource:
DEALER_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMER_VEHICLE :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
EMPLOYEE_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMERCREDIT_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CONTINUOUS_CAN_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
LOGIN_TABLE:
staginDir:
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter:
- "|"
检查下面的代码。
scala> "cat /tmp/sample.yaml".!
rawSource:
DEALER_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMER_VEHICLE :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
EMPLOYEE_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMERCREDIT_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CONTINUOUS_CAN_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
LOGIN_TABLE:
staginDir:
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter:
- "|"
scala> def loadYAML(path: String): String = {
| import com.fasterxml.jackson.databind.ObjectMapper
| import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
|
| val yaml = scala.io.Source.fromFile(path).getLines().mkString(" \n ")
| val yamlReader = new ObjectMapper(new YAMLFactory)
| val obj = yamlReader.readValue(yaml, classOf[Any])
| val jsonWriter = new ObjectMapper
| jsonWriter.writeValueAsString(obj)
| }
loadYAML: (path: String)String
scala> def getConfig(key: String)(yaml: String):(String,String,String) = {
| import org.json4s._
| import org.json4s.jackson.JsonMethods._
| implicit val formats = DefaultFormats
|
| val json = parse(yaml)
| val staginDir = ( json \ key \ "staginDir").extract[List[String]].head
| val rawLayerTbl = ( json \ key \ "rawLayerTbl").extract[List[String]].head
| val fileDelimiter = ( json \ key \ "fileDelimiter").extract[List[String]].head
| (staginDir, rawLayerTbl, fileDelimiter)
| }
getConfig: (key: String)(yaml: String)(String, String, String)
scala> val yaml = loadYAML("/tmp/sample.yaml")
yaml: String = {"rawSource":{"DEALER_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CUSTOMER_VEHICLE":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"EMPLOYEE_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CUSTOMERCREDIT_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CONTINUOUS_CAN_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"LOGIN_TABLE":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]}}}
输出
scala> val (staginDir, rawLayerTbl, fileDelimiter) = getConfig("CUSTOMER_VEHICLE")(yaml)
staginDir: String = ADLS BLOB LOCATION
rawLayerTbl: String = TABLE_NAME
fileDelimiter: String = |
我有如下所示的 JSON 文件,我的 Scala 程序必须将此 JSON 文件作为 args(0)
读取,对于 args(1)
我将通过CUSTOMER_VEHICLE 作为参数。根据传递的 args(1)
参数,程序必须获取相应的 staginDir 路径,rawLayerTbl(table name)
,fileDelimiter 作为三个独立的变量。
创建了一个案例 class 并尝试创建与案例 class 匹配的 JSON 对象,但运气不好,有没有使用 scala 实现此目的的简单方法。我需要在 Databricks 运行时版本 6.3(包括 Apache Spark 2.4.4、Scala 2.11)上执行此操作。
rawSource:
DEALER_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMER_VEHICLE :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
EMPLOYEE_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMERCREDIT_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CONTINUOUS_CAN_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
LOGIN_TABLE:
staginDir:
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter:
- "|"
检查下面的代码。
scala> "cat /tmp/sample.yaml".!
rawSource:
DEALER_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMER_VEHICLE :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
EMPLOYEE_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CUSTOMERCREDIT_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
CONTINUOUS_CAN_MASTER :
staginDir :
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter :
- "|"
LOGIN_TABLE:
staginDir:
- "ADLS BLOB LOCATION"
rawLayerTbl:
- "TABLE_NAME"
fileDelimiter:
- "|"
scala> def loadYAML(path: String): String = {
| import com.fasterxml.jackson.databind.ObjectMapper
| import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
|
| val yaml = scala.io.Source.fromFile(path).getLines().mkString(" \n ")
| val yamlReader = new ObjectMapper(new YAMLFactory)
| val obj = yamlReader.readValue(yaml, classOf[Any])
| val jsonWriter = new ObjectMapper
| jsonWriter.writeValueAsString(obj)
| }
loadYAML: (path: String)String
scala> def getConfig(key: String)(yaml: String):(String,String,String) = {
| import org.json4s._
| import org.json4s.jackson.JsonMethods._
| implicit val formats = DefaultFormats
|
| val json = parse(yaml)
| val staginDir = ( json \ key \ "staginDir").extract[List[String]].head
| val rawLayerTbl = ( json \ key \ "rawLayerTbl").extract[List[String]].head
| val fileDelimiter = ( json \ key \ "fileDelimiter").extract[List[String]].head
| (staginDir, rawLayerTbl, fileDelimiter)
| }
getConfig: (key: String)(yaml: String)(String, String, String)
scala> val yaml = loadYAML("/tmp/sample.yaml")
yaml: String = {"rawSource":{"DEALER_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CUSTOMER_VEHICLE":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"EMPLOYEE_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CUSTOMERCREDIT_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"CONTINUOUS_CAN_MASTER":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]},"LOGIN_TABLE":{"staginDir":["ADLS BLOB LOCATION"],"rawLayerTbl":["TABLE_NAME"],"fileDelimiter":["|"]}}}
输出
scala> val (staginDir, rawLayerTbl, fileDelimiter) = getConfig("CUSTOMER_VEHICLE")(yaml)
staginDir: String = ADLS BLOB LOCATION
rawLayerTbl: String = TABLE_NAME
fileDelimiter: String = |