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 _。 更…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...