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…

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;可以调整外观和行为…

spring-springboot -springcloud

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

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;控制器对指令进行分…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

2025-01-22 Unity Editor 1 —— MenuItem 入门

文章目录 1 Editor 文件夹2 MenuItem3 使用示例3.1 打开网址3.2 打开文件夹3.3 Menu Toggle3.4 Menu 代码复用3.5 MenuItem 激活与失活4 代码示例 1 Editor 文件夹 ​ Editor 文件夹是 Unity 中的特殊文件夹&#xff0c;Unity 中所有编辑器相关的脚本都需要放置在其中&#xf…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

linux-samba服务配置与应用

1.了解samba的配置文件 2.熟悉samba服务的实例 以前我们在windows上共享文件的话&#xff0c;只需右击要共享的文件夹&#xff0c;然后选择共享相关的选项设置即可&#xff0c;然后如何实现windows和linux的文件共享呢&#xff0c;这就涉及到了samba服务&#xff0c;这个软件…

Spring Boot 整合 Redis 步骤详解

文章目录 1. 引言2. 添加依赖3. 配置 Redis 连接信息4. 创建 Redis 操作服务类5. 使用 RedisTemplate 或 ReactiveRedisTemplate6. 测试 Redis 功能7. 注意事项8. 总结 Redis 是一个高性能的键值存储系统&#xff0c;常用于缓存、消息队列等多种场景。将 Redis 与 Spring Boot …

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明&#xff1a;用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询…

K8S中Service详解(三)

HeadLiness类型的Service 在某些场景中&#xff0c;开发人员可能不想使用Service提供的负载均衡功能&#xff0c;而希望自己来控制负载均衡策略&#xff0c;针对这种情况&#xff0c;kubernetes提供了HeadLiness Service&#xff0c;这类Service不会分配Cluster IP&#xff0c;…