当前位置: 首页 > news >正文

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类型的函数操作,这样能更加方便对字符串的解析。


相关文章:

Spark SQL中的from_json函数详解

Spark SQL中的from_json函数详解 在Spark SQL中&#xff0c;from_json是一个用于解析JSON数据的函数&#xff0c;主要用于将JSON格式的字符串解析为结构化的数据&#xff08;即StructType或其他Spark SQL数据类型&#xff09;。这个函数在处理半结构化数据&#xff08;如JSON日…...

【软件架构】软件的十二种架构简介

软件的十二种架构简介 一、软件的12种架构 1. 单体架构 (Monolithic Architecture)2. 分层架构 (Layered Architecture)3. 事件驱动架构 (Event-Driven Architecture)4. 微服务架构 (Microservices Architecture)5. 服务导向架构 (Service-Oriented Architecture, SOA)6. 客户…...

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…...

Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制

在Vue 3中&#xff0c;导航守卫&#xff08;Navigation Guard&#xff09;用于拦截路由的变化&#xff0c;可以在用户访问页面前进行检查。结合Axios进行token认证机制时&#xff0c;我们可以通过导航守卫在路由跳转时&#xff0c;检查用户的认证状态&#xff0c;确保用户有有效…...

【爬虫】使用 Scrapy 框架爬取豆瓣电影 Top 250 数据的完整教程

前言 在大数据和网络爬虫领域&#xff0c;Scrapy 是一个功能强大且广泛使用的开源爬虫框架。它能够帮助我们快速地构建爬虫项目&#xff0c;并高效地从各种网站中提取数据。在本篇文章中&#xff0c;我将带大家从零开始使用 Scrapy 框架&#xff0c;构建一个简单的爬虫项目&am…...

一分钟学习数据安全——白盒加密及安当应用

白盒加密作为一种先进的加密技术&#xff0c;在数据安全、通信安全和信息隐私保护等多个关键领域都有应用。这次的一分钟&#xff0c;让您快速了解一下白盒加密的概念&#xff0c;以及安当产品中的白盒加密应用。 一、什么是白盒加密 简单来说&#xff0c;白盒加密是一种特殊…...

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 原本是后端开发的主力语言&#xff0c;但它也提供了许多前端开发工具和框架。以下是 Java 前端开发的主要内容和技术栈。 一、Java 前端技术栈 Java Swing 和 AWT AWT (…...

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…...

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…...

实施工程师:面试基础宝典

一.运维工程师和实施工程师的区别&#xff1a;工作内容不同、职能不同、工作形式不同 1.工作内容不同&#xff1a; 运维工程师要对公司硬件和软件进行维护。 硬件包括&#xff1a;机房、机柜、网线光纤、PDU、服 务器、网络设备、安全设备等。 实施工程师包括常用操作系统、应…...

react install

react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤&#xff1a; 使用 Create React App Create React App 是一个官方支持的命令行工具&#xff0c;用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…...

ElasticSearch DSL查询之排序和分页

一、排序功能 1. 默认排序 在 Elasticsearch 中&#xff0c;默认情况下&#xff0c;查询结果是根据 相关度 评分&#xff08;score&#xff09;进行排序的。我们之前已经了解过&#xff0c;相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…...

uniapp封装websocket

WebSocket介绍 后端使用的是springbootnetty做websocket的服务端&#xff0c;参考我其他博文 项目使用场景 开发uniapp项目时&#xff0c;需要进行实时通信&#xff0c;比如聊天等。需要封装一个工具类&#xff0c;统一对socket进行管理。 uniapp websocket官方文档&#xff1…...

【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打开时&#xff0c;可以看到 public abstract class Flux<T> implements CorePublisher<T> { 2. public interface CorePublisher<T> extends Publisher<T> {void subscribe(CoreSubscriber<? super T> subscriber); } Publish…...

读西瓜书的数学准备

1&#xff0c;高等数学&#xff1a;会求偏导数就行 2&#xff0c;线性代数&#xff1a;会矩阵运算就行 参考&#xff1a;线性代数--矩阵基本计算&#xff08;加减乘法&#xff09;_矩阵运算-CSDN博客 3&#xff0c;概率论与数理统计&#xff1a;知道啥是随机变量就行...

摄像头模块如何应用在宠物产品领域

一、宠物监控类产品 家庭宠物远程监控摄像头 1.基本功能与原理&#xff1a;这类摄像头可以通过 Wi - Fi 连接到家庭网络&#xff0c;主人可以使用手机应用程序在任何有网络连接的地方查看宠物的实时画面。摄像头模块内置有图像传感器&#xff0c;能够捕捉光线并将其转换为数字…...

c++学习第七天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考。 一、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 _。 更…...

【NOIP】1999真题解析 luogu-P1014 Cantor 表 | GESP三、四级以上可练习

NOIP 1999 普及组真题&#xff0c;主要考察简单的二维矩阵模拟与通过寻找数学规律进行时间复杂度优化。可以用模拟法暴力求解&#xff0c;也能通过总结对角线的排列规律实现高效求解。GESP三、四级以上可练习。题目难度⭐⭐☆☆☆&#xff0c;洛谷难度等级普及−。 luogu-P101…...

崇左本地人推荐的越南火锅店必吃榜

一、行业现象观察在崇左地区&#xff0c;尤其是德天瀑布、明仕田园等旅游热点区域&#xff0c;餐饮消费呈现出明显的游客与本地人差异。本地食客普遍关注性价比与熟悉口味&#xff0c;而游客则更倾向于体验边境异国风味。近年来&#xff0c;越南风味餐饮在景区周边逐渐发展&…...

基于SpringBoot的高校餐饮档口管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

华为1+X《网络系统建设与运维(中级)》认证实验全流程解析与实战技巧

1. 华为1X认证实验环境搭建指南 第一次接触华为1X认证实验环境时&#xff0c;我也被那些专业术语和复杂配置搞得一头雾水。后来才发现&#xff0c;只要掌握几个关键点&#xff0c;环境搭建其实很简单。考试使用的是华为eNSP模拟器&#xff0c;这个软件完美复现了真实设备的功能…...

OpenClaw会议纪要自动化:Qwen3.5-9B实时转录与待办项提取

OpenClaw会议纪要自动化&#xff1a;Qwen3.5-9B实时转录与待办项提取 1. 为什么需要会议纪要自动化 每周三的团队例会总是让我头疼——90分钟的会议结束后&#xff0c;我需要花40分钟整理录音、标记关键决议、分配待办事项。直到上个月用OpenClawQwen3.5-9B搭建了自动化流程&…...

保姆级教程:用QGroundControl地面站V4.2.0连接Gazebo模拟无人机(附避坑指南)

从零到一&#xff1a;QGroundControl地面站与Gazebo无人机仿真全流程实战 无人机仿真技术已经成为开发者快速验证算法、学生入门飞控系统的首选方案。相比真机测试&#xff0c;仿真环境不仅成本低廉&#xff0c;还能避免硬件损坏风险。本文将手把手带你完成QGroundControl地面站…...

高压电源软启动:从浪涌抑制到系统可靠性的工程实践

1. 高压电源软启动的必要性 第一次见到整流二极管炸裂的场景&#xff0c;至今记忆犹新。那是在一个工业电源调试现场&#xff0c;工程师刚合上电闸就听到"啪"的一声脆响&#xff0c;随后便闻到焦糊味——价值数百元的整流模块瞬间报废。罪魁祸首就是电容滤波电路带来…...

SecGPT-14B知识库增强:让OpenClaw支持最新CVE漏洞库

SecGPT-14B知识库增强&#xff1a;让OpenClaw支持最新CVE漏洞库 1. 为什么需要给OpenClaw注入CVE知识库 去年处理Log4j2漏洞时&#xff0c;我遇到了一个尴尬场景&#xff1a;当我让OpenClaw帮我检查服务器是否存在CVE-2021-44228漏洞时&#xff0c;它给出的回答是"未找到…...

从YOLOv8到SpikeYOLO:在边缘设备上部署脉冲神经网络目标检测的完整实践指南

从YOLOv8到SpikeYOLO&#xff1a;边缘设备超低功耗目标检测实战手册 在无人机巡检、智能安防摄像头和可穿戴设备等边缘计算场景中&#xff0c;持续运行的目标检测系统常受限于电池容量与散热条件。传统卷积神经网络&#xff08;CNN&#xff09;如YOLOv8虽能实现实时检测&#x…...

基于django的社区设备报修住户反馈智能预测系统设计_1pyj28qj

前言本论文的研究目的是以Django架构为基础&#xff0c;建立一套针对住宅设施维修需求的住宅物业维修信息的智能预测系统。随着我国城镇化进程的持续推进&#xff0c;社区规模越来越大&#xff0c;传统的社区设施维修与信息处理模式已经很难满足现代化社区高效便捷管理的需要。…...