试图在scala中将json文件读入map[string,object]

7xllpg7q  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(371)

我正在尝试将一个json配置文件读入scala项目。json的格式如下:

{
  "parameters": [
    {
      "name": "testInteger",
      "type": "Integer",
      "value": "10"
    },
    {
      "name": "testString",
      "type": "String",
      "value": "yeah"
    }
  ]
}

我一直在使用spark生成Dataframe

val df = spark.read.option("multiline","true").json(path)

我需要将json文件中的数据读入具有键“name”和指定类型的值的Map
预期产量:

Map: "testInteger" -> 10
     "testString" -> "yeah"

我是新来的斯卡拉和不确定从哪里开始,任何建议将不胜感激。
(注:使用Java8和intellij编写)

6l7fqoea

6l7fqoea1#

所以,这是你应该做的,
创建sparksession,

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.{ArrayType, StructType}

val spark = SparkSession.builder().master("local[2]").getOrCreate()
import spark.implicits._

创建架构,

val schema = new StructType().add(
"parameters",ArrayType.apply(
      new StructType()
          .add("name", "string")
          .add("type", "string")
          .add("value", "string")
       ))

读取数据集,

val df = spark.read
      .option("multiline", "true")
      .schema(schema)
      .json("/path/to/json")
      .select(explode(col("parameters")).alias("params"))

这会给你一个 struct 包含字段的名为“params”的列 name , type 以及 value . 这看起来像,

root
 |-- params: struct (nullable = true)
 |    |-- name: string (nullable = true)
 |    |-- type: string (nullable = true)
 |    |-- value: string (nullable = true)

注:全部 struct 以及 map 类型列强制类型安全。因此架构不能在同一列中允许不同类型的值。所以你的价值观 value 场将被投射到 string . 根据您的用例,您可以使用 udf 使用字段在运行时强制转换对象 type .

相关问题