Pyspark:从涉及数组列的 Json 架构创建架构

2024-01-03

我在 json 文件中定义了 df 的架构,如下所示:

{
    "table1":{
        "fields":[
            {"metadata":{}, "name":"first_name", "type":"string", "nullable":false},
            {"metadata":{}, "name":"last_name", "type":"string", "nullable":false},
            {"metadata":{}, "name":"subjects", "type":"array","items":{"type":["string", "string"]}, "nullable":false},
            {"metadata":{}, "name":"marks", "type":"array","items":{"type":["integer", "integer"]}, "nullable":false},
            {"metadata":{}, "name":"dept", "type":"string", "nullable":false}       
        ]
    }

}

EG JSON 数据:

{
    "table1": [
        {
            "first_name":"john",
            "last_name":"doe",
            "subjects":["maths","science"],
            "marks":[90,67],
            "dept":"abc"        
        },
        {
            "first_name":"dan",
            "last_name":"steyn",
            "subjects":["maths","science"],
            "marks":[90,67],
            "dept":"abc"        
        },
        {
            "first_name":"rose",
            "last_name":"wayne",
            "subjects":["maths","science"],
            "marks":[90,67],
            "dept":"abc"            
        },
        {
            "first_name":"nat",
            "last_name":"lee",
            "subjects":["maths","science"],
            "marks":[90,67],
            "dept":"abc"        
        },
        {
            "first_name":"jim",
            "last_name":"lim",
            "subjects":["maths","science"],
            "marks":[90,67],
            "dept":"abc"        
        }       
    ]
}

我想从这个 json 文件创建等效的 Spark 模式。下面是我的代码:(参考:从 json 模式表示创建 Spark 数据帧模式 https://stackoverflow.com/questions/40957585/create-spark-dataframe-schema-from-json-schema-representation)

with open(schemaFile) as s:
 schema = json.load(s)["table1"]
 source_schema = StructType.fromJson(schema)

如果我没有任何数组列,上面的代码可以正常工作。但如果我的架构中有数组列,则会抛出以下错误。

“无法解析数据类型:数组” (“无法解析数据类型:%s”json_value)


在您的情况下,数组的表示存在问题。正确的语法是:

{ "metadata": {}, "name": "marks", "nullable": true, "type": {"containsNull": true, "elementType": "long", "type": "array" } }.

为了从 json 检索模式,您可以编写下一个 pyspark 片段:

jsonData = """{
    "table1": [{
            "first_name": "john",
            "last_name": "doe",
            "subjects": ["maths", "science"],
            "marks": [90, 67],
            "dept": "abc"
        },
        {
            "first_name": "dan",
            "last_name": "steyn",
            "subjects": ["maths", "science"],
            "marks": [90, 67],
            "dept": "abc"
        },
        {
            "first_name": "rose",
            "last_name": "wayne",
            "subjects": ["maths", "science"],
            "marks": [90, 67],
            "dept": "abc"
        },
        {
            "first_name": "nat",
            "last_name": "lee",
            "subjects": ["maths", "science"],
            "marks": [90, 67],
            "dept": "abc"
        },
        {
            "first_name": "jim",
            "last_name": "lim",
            "subjects": ["maths", "science"],
            "marks": [90, 67],
            "dept": "abc"
        }
    ]
}"""

df = spark.read.json(sc.parallelize([jsonData]))

df.schema.json()

这应该输出:

{
    "fields": [{
        "metadata": {},
        "name": "table1",
        "nullable": true,
        "type": {
            "containsNull": true,
            "elementType": {
                "fields": [{
                    "metadata": {},
                    "name": "dept",
                    "nullable": true,
                    "type": "string"
                }, {
                    "metadata": {},
                    "name": "first_name",
                    "nullable": true,
                    "type": "string"
                }, {
                    "metadata": {},
                    "name": "last_name",
                    "nullable": true,
                    "type": "string"
                }, {
                    "metadata": {},
                    "name": "marks",
                    "nullable": true,
                    "type": {
                        "containsNull": true,
                        "elementType": "long",
                        "type": "array"
                    }
                }, {
                    "metadata": {},
                    "name": "subjects",
                    "nullable": true,
                    "type": {
                        "containsNull": true,
                        "elementType": "string",
                        "type": "array"
                    }
                }],
                "type": "struct"
            },
            "type": "array"
        }
    }],
    "type": "struct"
}

或者,您可以使用df.schema.simpleString()这将返回一个相对简单的模式格式:

struct<table1:array<struct<dept:string,first_name:string,last_name:string,marks:array<bigint>,subjects:array<string>>>>

最后,您可以将上面的模式存储到一个文件中,并稍后使用以下命令加载它:

import json
new_schema = StructType.fromJson(json.loads(schema_json))

正如你已经做的那样。Remember您也可以针对任何 json 数据动态实现所描述的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pyspark:从涉及数组列的 Json 架构创建架构 的相关文章

随机推荐

  • 如何以编程方式授权用户进入phpMyAdmin?

    为了在 phpMyAdmin 中授权用户 当我们的应用程序中满足特定条件时 我们创建一个隐藏表单 带有预先填写的用户名和密码 并自动 使用 JavaScript 提交该表单 因此 我们正在执行此 技巧 if condition
  • Firestore 规则:当数据为数字时,条件检查失败

    以下是当条件中使用的文档字段的数据类型为 number 时失败的示例规则 match message box user id inbox allow read if get users request auth uid data user
  • iOS:如何在 Swift 中创建可扩展的 TableView,而不使用第三方库或 pod

    我已经用 swift 实现了 Tableview 但我想制作一个可扩展的 TableView 请给我一个想法 这是Tableview的代码 MARK TableView Delegate and Datasource func tableV
  • 在Android中设置ViewPager的默认页面

    我使用以下代码 MAX 是 2 页 默认位置为 0 并在右侧添加新页面 我膨胀了两个布局文件 如何在应用程序启动时显示 page1 并在左侧添加新页面 谢谢 main xml
  • .NET:考虑夏令时

    我有一个创建 UTC 的方法DateTime根据用户输入 使用其地理位置的 GMT 偏移量 public static DateTime LocalToUtc int year int month int day int hour deci
  • 底部按钮栏与 Listview 的最后一个元素重叠!

    我有一个列表视图 它是活动的一部分 我希望用户可以选择批量删除列表视图中的项目 因此当他从菜单中选择相应的选项时 每个列表项旁边都会有一个复选框 当用户单击任何复选框时 按钮栏将从底部向上滑动 如在 Gmail 应用程序中 单击删除按钮将删
  • 你什么时候想在 R 中设置新环境

    根据 R 编程风格的讨论 我看到有人曾经说过他将所有自定义函数放入一个新环境中并附加它 我还记得 R 环境可能用作哈希表 这样的风格好吗 您什么时候想将数据 功能放入新环境 或者只是使用 GlobalEnv 等等 EDIT把我问题的第二部分
  • /usr/include/linux 和 Linux 内核源代码中的 include 文件夹有什么区别?

    在新安装的 Ubuntu 上 我在两个文件中都找到了内核头文件 usr include linux and usr src kernel version headers include linux 它们彼此相同吗 They are very
  • 如何在 Liquid 的 for 循环中创建数组?

    我正在尝试使用 Liquid 语法从对象列表创建一个数组 for operation in menuItems assign words1 operation Title split assign controllerName words1
  • 从 C# 代码加密/解密连接字符串

    有什么方法可以从我的 C 代码中实现连接字符串的加密和解密吗 就像我们一样 aspnet regiis pe 连接字符串 aspnet regiis pd 连接字符串 Thanks static public void ProtectSec
  • 如何显示/隐藏ReactJS组件

    尝试学习 ReactJS 但令我困惑的是组件的渲染 我见过的每个例子都定义了一个 React 组件类 最后有类似的内容 React renderComponent
  • Pandas 系列到 json 并返回

    我在将简单的 Pandas Series 转换为 json 字符串并返回时遇到一些问题 这是我的尝试 import pandas as pd f pd Series data 1 0 2 0 3 0 index 10 20 30 x f t
  • 在reactJS中每X秒发出一次API请求

    进入时货币页面 我试图从数据库获取currencyConversionRates 列表 然后设置一个间隔以每6 秒不断获取新更新的currencyConversionRates 列表 到目前为止 一切正常 但是 我无法将 setInterv
  • 网站项目与 Web 应用程序 - 哪个更好?

    我刚刚开始使用cms N2 它有一个模板基本实现 使用vs2008中的网站项目模板 我注意到编译它比使用我更习惯的 Web 应用程序项目花费的时间要长得多 我的问题是 为什么编译似乎需要更长的时间 使用哪个更好 我应该将其转换为网络应用程序
  • 从 javac 或 JRE 获取没有编译类的 java 类版本

    Java 类版本可以使用以下命令从类二进制文件中获取javap javap verbose Test grep minor major minor version 0 major version 55 是否可以提前知道 JDK 将生成哪个类
  • 您可以在代码中导入“devDependency”吗?

    Mobx DevTool 的自述文件 https github com mobxjs mobx react devtools指导您将其安装为开发依赖项 然后将其导入到您的代码中 这对我来说似乎是一个问题 因为 devDependencies
  • 如何从给定的字符串中获取日期部分?

    我有这样的字符串 Mon 14 May 2012 13 56 38 GMT 现在我只想约会 即14 May 2012 为此我需要做什么 正确的方法是将其解析为Date对象并按照您想要的方式格式化该日期对象 DateFormat inputD
  • 将对象从 Java 传递到 Oracle 过程

    要将数组传递给 oracle 过程 我们使用ArrayDiscriptor and ARRAY 对象 我必须使用什么对象来将对象传递给 存储过程 ArrayDescriptor 和 ARRAY 类 以及 StructDescriptor 和
  • 如何在脚本中的多个文件中使用多个类?

    我需要制作一个独立的 Groovy 脚本 该脚本不需要编译并且无需安装 Groovy 即可运行 它运行良好 但无法识别除主脚本之外的任何其他脚本 我的文件夹结构如下 libs groovy all 2 4 3 jar ivy 2 4 0 j
  • Pyspark:从涉及数组列的 Json 架构创建架构

    我在 json 文件中定义了 df 的架构 如下所示 table1 fields metadata name first name type string nullable false metadata name last name typ