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 _。 更…...
FCEUX终极指南:从怀旧游戏到专业调试的完整NES模拟器教程
FCEUX终极指南:从怀旧游戏到专业调试的完整NES模拟器教程 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux FCEUX是一款功能强大的开源NES模拟器,让你在现代电脑上完美重温经典红白机游戏。无论…...
Godot中型项目工程化实践:目录规范、资源引用与状态管理
1. 这不是续集,而是项目落地的分水岭“Godot 游戏引擎项目(二)”——看到这个标题,很多人第一反应是:“哦,上一篇讲了环境搭建和Hello World,这篇该讲节点树和信号了?”但我在带三个…...
告别手写UI!用NXP GUI Guider拖拽设计LVGL界面,5分钟搞定音乐播放器Demo
嵌入式UI开发革命:5分钟用GUI Guider构建LVGL音乐播放器在嵌入式系统开发中,用户界面(UI)设计曾长期是工程师的痛点——既要考虑资源受限的硬件环境,又要实现流畅美观的交互体验。传统手动编写UI代码的方式不仅效率低下,调试过程更…...
为什么软件开发偏爱 Linux?深度剖析 Linux 相较于 Windows 的核心优势
引言 在软件开发的世界里,一个有趣的现象是:无论是大型互联网公司的服务器集群,还是资深程序员的个人开发机,Linux 操作系统的身影无处不在。与之形成鲜明对比的是,尽管 Windows 在个人消费市场占据绝对主导地位&…...
半导体元件(二极管/三极管/MOS管/IC)损坏诊断全解
半导体元件(二极管、三极管、MOS 管、集成电路)是 PCB 的核心功能单元,对过压、过流、ESD、高温极度敏感,损坏后直接导致电路功能失效、短路烧板。很多工程师维修时盲目更换芯片,不仅成本高,还易误判。一…...
巧用对称性与平均值原理:低成本实现高精度电阻分压器校准
1. 项目概述:用数学思维突破测量设备的精度极限在电子实验室里捣鼓精密电路,尤其是涉及到电压基准、信号调理或者高精度ADC前端时,一个绕不开的坎就是精密分压器。你可能在设计一个需要0.1%甚至更高精度的分压网络,但手头的万用表…...
Taotoken如何帮助教育科技产品实现个性化学习辅导
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken如何帮助教育科技产品实现个性化学习辅导 1. 场景与挑战 教育科技公司在开发个性化学习助手时,常常面临一个核…...
实战对比:用直方图均衡化与CLAHE拯救你的背光/过曝照片(附Python完整代码)
拯救逆光废片:直方图均衡化与CLAHE的实战效果对比每次旅行回来整理照片时,总会有几张因为光线问题几乎要删除的废片——要么是逆光下的人脸黑得看不清五官,要么是天空过曝失去所有云层细节。这些照片往往记录着重要时刻,直接删除实…...
qobuz-dl终极实战指南:专业无损音乐下载工具架构解析与高效应用
qobuz-dl终极实战指南:专业无损音乐下载工具架构解析与高效应用 【免费下载链接】qobuz-dl A complete Lossless and Hi-Res music downloader for Qobuz 项目地址: https://gitcode.com/gh_mirrors/qo/qobuz-dl 在数字音乐时代,追求极致音质的音…...
基于EMA与轻量级机器学习的Wi-Fi链路质量预测实战
1. 项目概述与核心价值在工业自动化、仓储物流和智能制造等场景里,无线网络的稳定性正变得前所未有的重要。想象一下,一个自动导引运输车(AGV)正在执行物料搬运任务,或者一个机械臂正在与中央控制系统进行实时数据同步…...
