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:控制解析模式:PERMISSIVE、DROPMALFORMED或FAILFAST,默认值: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数据场景。以下是常用场景的总结:
- 容错性控制:使用
mode和columnNameOfCorruptRecord。 - 时间和日期解析:使用
timestampFormat和dateFormat。 - 非标准JSON支持:使用
multiLine、allowUnquotedFieldNames、allowSingleQuotes、allowComments等。
5. from_json总结
from_json是Spark SQL中处理JSON数据的核心工具,它的核心是通过指定的schema将JSON字符串解析为结构化数据。通过灵活定义StructType、ArrayType等模式,可以处理简单到复杂的JSON数据结构。如果你有具体的JSON数据或使用场景,可以提供详细信息,我可以进一步帮助你解析和定义适合的schema!
from_json处理完后,我们对拿到的结果可能还要关联的内容spark sql 对struct、array、map类型的函数操作,这样能更加方便对字符串的解析。
相关文章:
Spark SQL中的from_json函数详解
Spark SQL中的from_json函数详解 在Spark SQL中,from_json是一个用于解析JSON数据的函数,主要用于将JSON格式的字符串解析为结构化的数据(即StructType或其他Spark SQL数据类型)。这个函数在处理半结构化数据(如JSON日…...
【软件架构】软件的十二种架构简介
软件的十二种架构简介 一、软件的12种架构 1. 单体架构 (Monolithic Architecture)2. 分层架构 (Layered Architecture)3. 事件驱动架构 (Event-Driven Architecture)4. 微服务架构 (Microservices Architecture)5. 服务导向架构 (Service-Oriented Architecture, SOA)6. 客户…...
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
日历热力图,月度数据可视化图表,vue组件 先看效果👇 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间,开始时间是 上一年的今天,例如2024/01/01 —— 2025/01/01,跨度刚…...
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
在Vue 3中,导航守卫(Navigation Guard)用于拦截路由的变化,可以在用户访问页面前进行检查。结合Axios进行token认证机制时,我们可以通过导航守卫在路由跳转时,检查用户的认证状态,确保用户有有效…...
【爬虫】使用 Scrapy 框架爬取豆瓣电影 Top 250 数据的完整教程
前言 在大数据和网络爬虫领域,Scrapy 是一个功能强大且广泛使用的开源爬虫框架。它能够帮助我们快速地构建爬虫项目,并高效地从各种网站中提取数据。在本篇文章中,我将带大家从零开始使用 Scrapy 框架,构建一个简单的爬虫项目&am…...
一分钟学习数据安全——白盒加密及安当应用
白盒加密作为一种先进的加密技术,在数据安全、通信安全和信息隐私保护等多个关键领域都有应用。这次的一分钟,让您快速了解一下白盒加密的概念,以及安当产品中的白盒加密应用。 一、什么是白盒加密 简单来说,白盒加密是一种特殊…...
composer安装指定php版本, 忽略平台原因导致的报错
windows下 //composer安装指定php版本, 写出完整的php和composer.phar路径 D:\phpstudy_pro\Extensions\php\php8.1.11nts\php.exe D:\phpstudy_pro\Extensions\composer1.8.5\composer.phar install windows下一些扩展不支持, 如下图, 所以本地composer安装组件时可以忽略 …...
Java 前端详解
Java 前端详解 Java 前端开发主要涉及使用 Java 相关技术和框架来创建用户界面和处理用户交互。虽然 Java 原本是后端开发的主力语言,但它也提供了许多前端开发工具和框架。以下是 Java 前端开发的主要内容和技术栈。 一、Java 前端技术栈 Java Swing 和 AWT AWT (…...
鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象
在启动调试或运行应用/服务时,安装HAP出现错误,提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权,但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…...
Javaweb之css
css的三种引入方式 1内行式 2.内嵌式 3.外部样式表 内行式和内嵌式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...
实施工程师:面试基础宝典
一.运维工程师和实施工程师的区别:工作内容不同、职能不同、工作形式不同 1.工作内容不同: 运维工程师要对公司硬件和软件进行维护。 硬件包括:机房、机柜、网线光纤、PDU、服 务器、网络设备、安全设备等。 实施工程师包括常用操作系统、应…...
react install
react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤: 使用 Create React App Create React App 是一个官方支持的命令行工具,用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…...
ElasticSearch DSL查询之排序和分页
一、排序功能 1. 默认排序 在 Elasticsearch 中,默认情况下,查询结果是根据 相关度 评分(score)进行排序的。我们之前已经了解过,相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…...
uniapp封装websocket
WebSocket介绍 后端使用的是springbootnetty做websocket的服务端,参考我其他博文 项目使用场景 开发uniapp项目时,需要进行实时通信,比如聊天等。需要封装一个工具类,统一对socket进行管理。 uniapp websocket官方文档࿱…...
【Linux】18.Linux进程控制(2)
文章目录 3. 进程程序替换3.1 单进程版 -- 看看程序替换3.2 替换原理3.3 替换函数函数解释命名理解 3.4 多进程版 -- 验证各种程序替换接口3.5 自定义shell 3. 进程程序替换 3.1 单进程版 – 看看程序替换 makefile mycommand:mycommand.cgcc -o $ $^ -stdc99 .PHONY:clean …...
reactor框架使用时,数据流请求流程
1. 我们在Flux打开时,可以看到 public abstract class Flux<T> implements CorePublisher<T> { 2. public interface CorePublisher<T> extends Publisher<T> {void subscribe(CoreSubscriber<? super T> subscriber); } Publish…...
读西瓜书的数学准备
1,高等数学:会求偏导数就行 2,线性代数:会矩阵运算就行 参考:线性代数--矩阵基本计算(加减乘法)_矩阵运算-CSDN博客 3,概率论与数理统计:知道啥是随机变量就行...
摄像头模块如何应用在宠物产品领域
一、宠物监控类产品 家庭宠物远程监控摄像头 1.基本功能与原理:这类摄像头可以通过 Wi - Fi 连接到家庭网络,主人可以使用手机应用程序在任何有网络连接的地方查看宠物的实时画面。摄像头模块内置有图像传感器,能够捕捉光线并将其转换为数字…...
c++学习第七天
创作过程中难免有不足,若您发现本文内容有误,恳请不吝赐教。 提示:以下是本篇文章正文内容,下面案例可供参考。 一、const成员函数 //Date.h#pragma once#include<iostream> using namespace std;class Date { public:Date…...
Ubuntu 24.04 LTS 通过 docker 安装 nextcloud 搭建个人网盘
准备 Ubuntu 24.04 LTSUbuntu 空闲硬盘挂载Ubuntu 安装 Docker DesktopUbuntu 24.04 LTS 安装 tailscale [我的Ubuntu服务器折腾集](https://blog.csdn.net/jh1513/article/details/145222679。 安装 nextcloud 参考 Ubuntu24.04系统Docker安装NextcloudOnlyoffice _。 更…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
