当前位置: 首页 > 知识库问答 >
问题:

从ArrayType()和StructType()创建MapType

林烨烨
2023-03-14

我有一个类似这样的JSON:

 "mapping_field" : {
        "values" : {
            "key1" : {
                "id" : "key1", 
                "field1" : "value1", 
                "field2" : "value2", 
            }, 
            "key2" : {
                "id" : "key2", 
                "field1" : "value3", 
                "field2" : "value4", 
            }
        }, 
        "keys" : [
            "key1", 
            "key2"
        ]
}

我正在尝试将此结构映射到 Spark 架构。我已经创建了以下内容;但是它不起作用。我还尝试在值字段映射中移除数组类型

StructType("mapping_field",
    MapType(
        StructField("keys", ArrayType(StringType())),
        StructField("values", ArrayType(StructType([
            StructField("id",StringType()),
            StructField("field1",StringType()),
            StructField("field2",StringType())
        ])))
    )
)

另外,请注意,它们“key1”和“key2”是动态字段,将使用唯一标识符生成。也可以有两个以上的键。有没有人能够将数组类型映射到结构类型?

共有1个答案

公孙阳羽
2023-03-14

所提供 JSON 的结构类型:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.{ArrayType, MapType, StructField, StructType, StringType}

val json = """ {
    "mapping_field" : {
            "values" : {
                "key1" : {
                    "id" : "key1",
                    "field1" : "value1",
                    "field2" : "value2"
                },
                "key2" : {
                    "id" : "key2",
                    "field1" : "value3",
                    "field2" : "value4"
                }
            },
            "keys" : [
                "key1",
                "key2"
            ]
    }
  }
  """


val struct = StructType(
  StructField("mapping_field", StructType(
    StructType(
      StructField("values", MapType(StringType, StructType(
        StructField("id", StringType, false) ::
        StructField("field1", StringType, false) ::
        StructField("field2", StringType, false) :: Nil)
      ), false) ::
      StructField("keys", ArrayType(StringType), false) :: Nil)
  ), false) :: Nil)

import spark.implicits._
val df = List(json)
    .toDF("json_col")
    .select(from_json($"json_col", struct))
 类似资料:
  • 我有一个以XML形式出现的数据集,其中一个节点包含JSON。Spark将其作为StringType读入,因此我尝试使用from_json()将json转换为数据帧。 我可以将字符串转换为JSON,但如何编写模式来处理数组? 没有数组的字符串-工作得很好 带数组的字符串 - 无法弄清楚这个

  • 我是新的spark和python,面临着从元数据文件构建模式的困难,该模式可以应用于我的数据文件。场景:数据文件的元数据文件(csv格式),包含列及其类型:例如: 我已成功将其转换为如下数据帧: 但是当我尝试用这个将其转换为StructField格式时 或 然后使用 我得到以下错误: 一旦我准备好了模式,我想使用createDataFrame来应用于我的数据文件。这个过程必须为许多表完成,所以我不

  • (编辑)更改了字段名称(从foo、bar……改为name和city),因为旧的名称令人困惑 我需要在多个UDF中使用单个函数,并根据输入返回不同的结构。 我的实现的这个简化版本基本上完成了我正在寻找的内容: (编辑)输出: 但是,返回StructType的ArrayType的代码不幸失败: 错误消息是: ValueError:结构类型的意外元组“名称” (编辑)所需输出为: 但是,其他类型(Str

  • 如何将一个新的列事件添加到数据帧中,该事件将是< code>generate_header的结果?如何添加一行作为列值? 可能我们需要将函数转换为UDF 假设我们有这样的东西 我们想得到这个

  • 如何使用Spark Java中的StructType为以下数据定义数据类型? 字段包括:姓名、地址、ID、REPORTCARD 我有以下代码: 现在,我需要使用以下行将javaRDD转换为数据帧(数据集df): 我需要为此创建StructType架构。如何在Spark Java中定义它。 我创建了以下StructType模式: 但我得到了以下例外:

  • 问题内容: MySQL中有没有办法从DATE类型的给定属性和TIME类型的给定属性创建DATETIME? 问题答案: