Spark SQL中的from_json函数详解

Spark SQL中的from_json函数详解

在Spark SQL中,from_json是一个用于解析JSON数据的函数,主要用于将JSON格式的字符串解析为结构化的数据(即StructType或其他Spark SQL数据类型)。这个函数在处理半结构化数据(如JSON日志、嵌套结构数据)时非常有用。

1. 基本用法

from_json的主要作用是将JSON字符串解析为指定的Spark SQL数据类型(如StructType、ArrayType等)。通常与schema(模式定义)结合使用,明确解析后数据的结构。

语法

from_json(json_string, schema [, options])
  • json_string:要解析的JSON字符串。
  • schema:定义JSON数据结构的模式,可以是StructType、ArrayType等。
  • options(可选):用于指定解析选项(如是否允许解析失败、空值处理等)。

2. 数据结构内容(Schema 定义)

from_json函数需要明确的模式定义(schema),以便将JSON字符串解析为结构化数据。模式可以是以下几种Spark SQL数据类型:

2.1 基本数据类型

  • StringType:字符串
  • IntegerType:整数
  • LongType:长整型
  • DoubleType:双精度浮点型
  • BooleanType:布尔值
  • TimestampType:时间戳
  • DateType:日期

2.2 复杂数据类型

  • StructType:结构体,类似于JSON对象。
  • ArrayType:数组,类似于JSON数组。
  • MapType:键值对,类似于JSON中的键值结构。

3. 使用示例

3.1 示例解析简单JSON

JSON数据:

{"name": "Alice", "age": 25}

SQL实现:

CREATE OR REPLACE TEMP VIEW json_table AS 
SELECT '{"name": "Alice", "age": 25}' AS json_string;SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>') AS parsed
FROM json_table;

输出结果:

+----------------+
|parsed          |
+----------------+
|{Alice, 25}     |
+----------------+

3.2 示例:解析嵌套JSON

JSON数据:

{"name": "Alice","info": {"age": 25,"city": "New York"}
}

SQL实现:

CREATE OR REPLACE TEMP VIEW json_table AS 
SELECT '{"name": "Alice", "info": {"age": 25, "city": "New York"}}' AS json_string;SELECT from_json(json_string, 'STRUCT<name: STRING, info: STRUCT<age: INT, city: STRING>>') AS parsed
FROM json_table;

输出结果:

+-------------------------+
|parsed                  |
+-------------------------+
|{Alice, {25, New York}} |
+-------------------------+

3.3 示例:解析JSON数组

JSON数据:

[{"name": "Alice", "age": 25},{"name": "Bob", "age": 30}
]

SQL实现:

CREATE OR REPLACE TEMP VIEW json_table AS 
SELECT '[{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]' AS json_string;SELECT from_json(json_string, 'ARRAY<STRUCT<name: STRING, age: INT>>') AS parsed
FROM json_table;

输出结果:

+--------------------------+
|parsed                   |
+--------------------------+
|[{Alice, 25}, {Bob, 30}] |
+--------------------------+

3.4 示例:解析并提取嵌套字段

JSON数据:

{"name": "Alice","info": {"age": 25,"city": "New York"}
}

SQL实现:

CREATE OR REPLACE TEMP VIEW json_table AS 
SELECT '{"name": "Alice", "info": {"age": 25, "city": "New York"}}' AS json_string;SELECT parsed.name AS name,parsed.info.age AS age,parsed.info.city AS city
FROM (SELECT from_json(json_string, 'STRUCT<name: STRING, info: STRUCT<age: INT, city: STRING>>') AS parsedFROM json_table
);

输出结果:

+-------+---+----------+
|name   |age|city      |
+-------+---+----------+
|Alice  |25 |New York  |
+-------+---+----------+

4. 常见选项(Options)

以下是from_json中支持的常见options参数,以及它们的详细说明和使用案例。

4.1 常见 Options 参数

  • mode:控制解析模式:PERMISSIVEDROPMALFORMEDFAILFAST,默认值:PERMISSIVE。
  • columnNameOfCorruptRecord:如果解析失败,存储错误记录的列名,默认值:空值(无默认值)。
  • timestampFormat:指定时间戳格式,默认值:yyyy-MM-dd’T’HH:mm:ss.SSSXXX。
  • dateFormat:指定日期格式,默认值:yyyy-MM-dd。
  • multiLine:是否允许JSON跨行(即多行JSON),默认值:false。
  • allowUnquotedFieldNames:是否允许字段名不使用引号,默认值:false。
  • allowSingleQuotes:是否允许字段名和字符串值使用单引号,默认值:true。
  • allowNumericLeadingZeros:是否允许数字前置零,默认值:false。
  • allowBackslashEscapingAnyCharacter:是否允许反斜杠转义任意字符,默认值:false。
  • allowComments:是否允许JSON中存在注释(如///* */),默认值:false。

4.2 Options 参数详细解析与案例

4.2.1 mode

mode用于控制解析模式,支持以下三种模式:

  • PERMISSIVE(默认):尝试解析尽可能多的数据。如果某些JSON数据解析失败,Spark会将失败的记录存储在_corrupt_record列中。
  • DROPMALFORMED:丢弃所有解析失败的记录。
  • FAILFAST:如果发现解析错误,则直接抛出异常,停止执行。

案例:mode参数

JSON数据:

{"name": "Alice", "age": 25}
{"name": "Bob", "age": "invalid"}
{"name": "Charlie"}

SQL查询:

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('mode', 'PERMISSIVE')) AS parsed
FROM json_table;

输出(PERMISSIVE模式,失败的记录存储在_corrupt_record):

+----------------+
|parsed          |
+----------------+
|{Alice, 25}     |
|null            |
|null            |
+----------------+

如果使用DROPMALFORMED

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('mode', 'DROPMALFORMED')) AS parsed
FROM json_table;

输出(解析失败的记录被丢弃):

+----------------+
|parsed          |
+----------------+
|{Alice, 25}     |
+----------------+

如果使用FAILFAST

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('mode', 'FAILFAST')) AS parsed
FROM json_table;

输出:Spark会抛出解析失败的异常。

4.2.2 columnNameOfCorruptRecord

指定存储解析失败记录的列名。如果设置了该选项,解析失败的JSON会存储在指定的列中,而不是默认的_corrupt_record列。

案例:columnNameOfCorruptRecord

JSON数据:

{"name": "Alice", "age": 25}
{"name": "Bob", "age": "invalid"}

SQL查询:

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('columnNameOfCorruptRecord', 'error_record')) AS parsed
FROM json_table;

输出:

+----------------+-------------------+
|parsed          |error_record       |
+----------------+-------------------+
|{Alice, 25}     |null               |
|null            |{"name": "Bob",...}|
+----------------+-------------------+
4.2.3 timestampFormat 和 dateFormat

用于指定时间戳和日期字段的解析格式。

案例:timestampFormat 和 dateFormat

JSON数据:

{"name": "Alice", "timestamp": "2023-01-01T12:00:00", "birth_date": "1990-01-01"}

SQL查询:

SELECT from_json(json_string, 'STRUCT<name: STRING, timestamp: TIMESTAMP, birth_date: DATE>', map('timestampFormat', 'yyyy-MM-dd\'T\'HH:mm:ss', 'dateFormat', 'yyyy-MM-dd')) AS parsed
FROM json_table;

输出:

+-------------------------------+
|parsed                        |
+-------------------------------+
|{Alice, 2023-01-01 12:00:00, 1990-01-01}|
+-------------------------------+
4.2.4 multiLine

指定是否允许JSON数据跨多行。默认值为false。

案例:multiLine

JSON数据:

{"name": "Alice","age": 25
}

SQL查询(multiLine=false,无法解析多行JSON):

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('multiLine', 'false')) AS parsed
FROM json_table;

输出:

+----------------+
|parsed          |
+----------------+
|null            |
+----------------+

SQL查询(multiLine=true,支持多行JSON):

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('multiLine', 'true')) AS parsed
FROM json_table;

输出:

+----------------+
|parsed          |
+----------------+
|{Alice, 25}     |
+----------------+
4.2.5 allowUnquotedFieldNames

允许JSON中的字段名不加引号。

案例:allowUnquotedFieldNames

JSON数据:

{name: "Alice", age: 25}

SQL查询:

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('allowUnquotedFieldNames', 'true')) AS parsed
FROM json_table;

输出:

+----------------+
|parsed          |
+----------------+
|{Alice, 25}     |
+----------------+
4.2.6 allowSingleQuotes

允许JSON中的字段名和字符串值使用单引号。

案例:allowSingleQuotes

JSON数据:

{'name': 'Alice', 'age': 25}

SQL查询:

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('allowSingleQuotes', 'true')) AS parsed
FROM json_table;

输出:

+----------------+
|parsed          |
+----------------+
|{Alice, 25}     |
+----------------+
4.2.7 allowComments

允许JSON数据中包含注释(如///* */)。

案例:allowComments

JSON数据:

{"name": "Alice", // This is a comment"age": 25
}

SQL查询:

SELECT from_json(json_string, 'STRUCT<name: STRING, age: INT>', map('allowComments', 'true')) AS parsed
FROM json_table;

输出:

+----------------+
|parsed          |
+----------------+
|{Alice, 25}     |
+----------------+

4.3 Options参数总结

from_json的options参数提供了灵活的JSON解析配置,适用于各种复杂或非标准的JSON数据场景。以下是常用场景的总结:

  • 容错性控制:使用modecolumnNameOfCorruptRecord
  • 时间和日期解析:使用timestampFormatdateFormat
  • 非标准JSON支持:使用multiLineallowUnquotedFieldNamesallowSingleQuotesallowComments等。

5. from_json总结

from_json是Spark SQL中处理JSON数据的核心工具,它的核心是通过指定的schema将JSON字符串解析为结构化数据。通过灵活定义StructType、ArrayType等模式,可以处理简单到复杂的JSON数据结构。如果你有具体的JSON数据或使用场景,可以提供详细信息,我可以进一步帮助你解析和定义适合的schema!
from_json处理完后,我们对拿到的结果可能还要关联的内容spark sql 对struct、array、map类型的函数操作,这样能更加方便对字符串的解析。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode_3092. 最高频率的 ID

https://leetcode.cn/problems/most-frequent-ids/description/ 看到这个数据范围 最极端情况 如果nums全为一个数 并且数量取到最大 那么范围是10的10次方 需要longlong储存 这题主要运用了哈希表配合multiset实现 哈希表主要用作存储某个数的出现次数 mst则用于记录出现次…

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…

如何把jupyter的一个.ipynb文件的多个单元格cell合并为1个cell

1 jupyter的一个.ipynb文件的多个单元格cell合并为1个cell 步骤 1&#xff1a;打开 your_notebook.ipynb 文件 启动 Jupyter Notebook。 导航到你的工作目录&#xff08;例如 F:\main&#xff09;。 打开 your_notebook.ipynb 文件。 步骤 2&#xff1a;选择所有单元格 点击…

集成Sleuth实现链路追踪

文章目录 1.新增sunrays-common-cloud模块1.在sunrays-framework下创建2.pom.xml3.查看是否被sunrays-framework管理 2.创建common-cloud-sleuth-starter1.目录结构2.pom.xml3.sunrays-dependencies指定cloud版本4.SleuthAutoConfiguration.java5.spring.factories 3.创建commo…

AIP-127 HTTP和gRPC转码

编号127原文链接AIP-127: HTTP and gRPC Transcoding状态批准创建日期2019-08-22更新日期2019-08-22 遵守面向资源设计的API使用RPC进行定义&#xff0c;但面向资源设计框架允许这些API表现为整体上符合REST/JSON约定的接口。这一点很重要&#xff0c;可以帮助开发者利用现有知…

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础 | 初探 WPF&#xff1a;理解其核心架构与开发环境搭建 一、前言二、WPF 核心架构2.1 核心组件2.2 布局系统2.3 数据绑定机制2.4 事件处理机制 三、WPF 开发环境搭建3.1 安装 Visual Studio3.2 创建第一个 WPF 应用程序 结束语优质源码分享 WPF基础 | 初探 WPF&#xff…

字节跳动自研HTTP开源框架Hertz简介附使用示例

字节跳动自研 HTTP 框架 Hertz Hertz 是字节跳动自研的高性能 HTTP 框架&#xff0c;专为高并发、低延迟的场景设计。它基于 Go 语言开发&#xff0c;结合了字节跳动在微服务架构中的实践经验&#xff0c;旨在提供更高效的 HTTP 服务开发体验。 1. 背景介绍 随着字节跳动业务…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

在线可编辑Excel

1. Handsontable 特点&#xff1a; 提供了类似 Excel 的表格编辑体验&#xff0c;包括单元格样式、公式计算、数据验证等功能。 支持多种插件&#xff0c;如筛选、排序、合并单元格等。 轻量级且易于集成到现有项目中。 具备强大的自定义能力&#xff0c;可以调整外观和行为…

Vue.js 渐进式增强:如何逐步为传统项目注入活力

Vue.js 是一个渐进式框架&#xff0c;这意味着你可以将它逐步引入到现有项目中&#xff0c;而无需彻底重构。渐进式增强特别适合那些已经在使用传统服务器渲染框架&#xff08;如 PHP、Django、Laravel&#xff09;的项目&#xff0c;为它们增加动态交互功能。本篇教程将介绍如…

重构(4)

&#xff08;一&#xff09;添加解释性变量&#xff0c;使得代码更容易理解&#xff0c;更容易调试&#xff0c;也可以方便功能复用 解释性的变量 总价格为商品总价&#xff08;单价*数量&#xff09;-折扣&#xff08;超过100个以上的打9折&#xff09;邮费&#xff08;原价的…

某金融科技公司内腾讯专有云企业版TCE结合宁盾2FA双因子认证满足商用密码应用安全性评估

项目背景 金融行业数据安全至关重要&#xff0c;涉及国家经济安全和公民个人信息安全。监管机构为了确保金融体系的安全稳定&#xff0c;对金融机构的密码应用提出了严格要求。例如&#xff0c;国务院办公厅早在 2014 年发布的《金融领域密码应用指导意见》明确指出&#xff0c…

Seata进阶全文详解(集成Nacos及SpringCloud配置)

Seata 简介 在当今微服务架构盛行的时代&#xff0c;分布式系统中的事务管理成为了一个极具挑战性的问题。Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;应运而生&#xff0c;它是一款专为微服务架构设计的分布式事务解决方案&#xf…

spring-springboot -springcloud

目录 spring: 动态代理: spring的生命周期(bean的生命周期): SpringMvc的生命周期: SpringBoot: 自动装配: 自动装配流程: Spring中常用的注解&#xff1a; Spring Boot中常用的注解&#xff1a; SpringCloud: 1. 注册中心: 2. gateway(网关): 3. Ribbon(负载均…

STM32更新程序OTA

STM32的OTA&#xff08;Over-The-Air&#xff09;更新程序是一种通过无线通信方式&#xff0c;为设备分发新软件、配置甚至更新加密密钥的技术。以下是关于STM32 OTA更新程序的详细介绍&#xff1a; 一、OTA升级流程 STM32的OTA升级流程通常包括以下几个关键步骤&#xff1a;…

DAY9,递归实现计算 :1 + 1/3 - 1/5 + 1/7 - 1/9 + .... 1/n 的值

题目 用递归实现计算 :1 1/3 - 1/5 1/7 - 1/9 .... 1/n 的值&#xff0c;n通过键盘输入 思路 递进阶段&#xff1a;n、...... 、9、7、5、3、1 函数出口&#xff1a;递进到1 开始返回&#xff1b;函数返回值视为“总和” 回归阶段&#xff1a;对当前n取倒数&#xff1b;“总…

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念&#xff0c;本文就将对此…

【27】Word:徐雅雯-艺术史文章❗

目录 题目​ NO1.2 NO3 NO4 NO5 NO6.7 NO8.9 NO10.11 注意&#xff1a;修改样式的字体颜色/字号&#xff0c;若中英文一致&#xff0c;选择所有脚本。格式相似的文本→检查多选/漏选格式刷F4重复上一步操作请❗每一步检查和保存 题目 NO1.2 F12另存为布局→行号布局…

关于ARM和汇编语言

一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段&#xff1a;控制器器通过地址总线向存储器发送想要获取的指令的地址编号&#xff0c;存储器将指定的指令发送给处理器 译码阶段&#xff1a;控制器对指令进行分…

Ubuntu20.04 文件系统打不开

问题描述: 电脑中安装了相关的工具, 删除了一些东西之后,Linux 电脑操作系统为 Ubuntu20.04突然打不开文件系统了,命令 sudo nautilus 可以正常进入, 显示了很多权限问题。 使用过&#xff1a; killall nautilus 不起作用&#xff0c;后查原因&#xff1a;我无法作为普通用户…