背景

本文基于Spark 4.0。

总结

对于半结构化的数据来说,我们一般会有两种方式进行存储:
第一种是存储为JSON String,这种可以保证Schema free,但是在使用的时候得解析为JSON,从而进行运算操作。
第二种是存储为Struct类型,这种虽然性能好,但是Schema是不可变的
所以引入了Variant类型:

  • Schema free以及相对于json String来说会有更好的查询性能,且使半结构化数据处理快速简单。
  • Variant数据类型以灵活的方式存储半结构化数据
  • 无需预先定义模式。
  • Variant二进制编码还允许比解析字符串更快地处理数据。

分析

直接到 Variant 对应的getFieldByKey方法(这个方法相对于JSON String来说就是获取某个JSON所对应key的值):

public Variant getFieldByKey(String key) {return handleObject(value, pos, (size, idSize, offsetSize, idStart, offsetStart, dataStart) -> {// Use linear search for a short list. Switch to binary search when the length reaches// `BINARY_SEARCH_THRESHOLD`.final int BINARY_SEARCH_THRESHOLD = 32;if (size < BINARY_SEARCH_THRESHOLD) {for (int i = 0; i < size; ++i) {int id = readUnsigned(value, idStart + idSize * i, idSize);if (key.equals(getMetadataKey(metadata, id))) {int offset = readUnsigned(value, offsetStart + offsetSize * i, offsetSize);return new Variant(value, metadata, dataStart + offset);}}} else {int low = 0;int high = size - 1;while (low <= high) {// Use unsigned right shift to compute the middle of `low` and `high`. This is not only a// performance optimization, because it can properly handle the case where `low + high`// overflows int.int mid = (low + high) >>> 1;int id = readUnsigned(value, idStart + idSize * mid, idSize);int cmp = getMetadataKey(metadata, id).compareTo(key);if (cmp < 0) {low = mid + 1;} else if (cmp > 0) {high = mid - 1;} else {int offset = readUnsigned(value, offsetStart + offsetSize * mid, offsetSize);return new Variant(value, metadata, dataStart + offset);}}}return null;});}

其中 handleObject 方法用来获取 Variant 对象的元数据信息,

public static <T> T handleObject(byte[] value, int pos, ObjectHandler<T> handler) {checkIndex(pos, value.length);int basicType = value[pos] & BASIC_TYPE_MASK;int typeInfo = (value[pos] >> BASIC_TYPE_BITS) & TYPE_INFO_MASK;if (basicType != OBJECT) throw unexpectedType(Type.OBJECT);// Refer to the comment of the `OBJECT` constant for the details of the object header encoding.// Suppose `typeInfo` has a bit representation of 0_b4_b3b2_b1b0, the following line extracts// b4 to determine whether the object uses a 1/4-byte size.boolean largeSize = ((typeInfo >> 4) & 0x1) != 0;int sizeBytes = (largeSize ? U32_SIZE : 1);int size = readUnsigned(value, pos + 1, sizeBytes);// Extracts b3b2 to determine the integer size of the field id list.int idSize = ((typeInfo >> 2) & 0x3) + 1;// Extracts b1b0 to determine the integer size of the offset list.int offsetSize = (typeInfo & 0x3) + 1;int idStart = pos + 1 + sizeBytes;int offsetStart = idStart + size * idSize;int dataStart = offsetStart + (size + 1) * offsetSize;return handler.apply(size, idSize, offsetSize, idStart, offsetStart, dataStart);}

在这里插入图片描述

按照以上的布局来进行获取 该 object大小,field id list大小, offset list大小,id list的起始位,offset的起始位置。

接下来就是循环调用 getMetadataKey 方法获取每个key(通过offset[i+1]- offset[i])的具体值,与当前的key进行比对,如果相等,则返回,之后再返回new Variant(value, metadata, dataStart + offset)对象,其中会带有该key对应的起始offset
如果想要得到具体的类型值,直接通过对应的方法获取即可,比如说getString

注意:如果该object的字节长度大于32字节,则用二分查找来查找,否则用顺序查找。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88140.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88140.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88140.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17-C#封装,继承,多态与重载

C#封装继承多态 1. 2. 3.多态 public abstract class animal//抽象类 {public abstract void eat();//抽象方法 } public class cat : animal//继承 {public override void eat()//重写{messagebox.show("cat eat");} } public class dog: animal//继承 {public over…

恒创科技:香港站群服务器做seo站群优化效果如何

香港站群服务器做 SEO 站群优化效果如何?在当前搜索引擎优化竞争日益激烈的环境下&#xff0c;越来越多的企业开始关注站群策略这一高效的 SEO 手段。作为亚洲重要的网络枢纽&#xff0c;香港站群服务器因其独特优势&#xff0c;正成为实施 SEO 站群优化的热门选择。本文将客观…

Linux-进程管理

Linux-进程管理Linux 进程管理1. 进程的含义2. 进程状态3. 进程工作模式4. 守护进程5. 进程查看命令5.1 ps 命令5.2 top 命令5.3 pstree 命令6. 终止进程的 kill 命令7. 前后台运行8. 暂停进程9. 进程文件系统 /proc10. 定时任务管理10.1 at 命令10.2 batch 命令10.3 cron 与 c…

OpenCV图像增强秘籍:高通滤波与特效艺术

> 在数字图像处理领域,边缘是图像最富信息的区域。掌握高通滤波技术,你就能让图像中的隐藏细节"跃然纸上",甚至创造惊艳的艺术效果。 ## 一、图像增强与高通滤波基础 ### 1.1 图像增强的核心目标 图像增强不是简单的美化,而是通过技术手段**突出重要特征*…

347. 前K个高频元素

题目&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例&#xff1a; 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 解题思路&#xff1a; 要返回出现频率前k高的元素&#xff0c;那么我们首…

C++面试冲刺笔记1:虚函数的基本工作原理

C面试冲刺笔记1&#xff1a;虚函数的基本工作原理 前言 ​ 笔者最近开始投简历&#xff0c;出于应对之后快速的面试流程需求&#xff0c;这里准备的是将常见的C八股文进行总结&#xff0c;从而方便自己进行学习&#xff0c;检查和评估。 什么是虚函数 ​ 虚函数&#xff0c;本质…

Spring Boot 事务失效问题详解:原因、场景与解决方案

在 Spring Boot 开发中&#xff0c;事务管理是保证数据一致性和完整性的核心机制。然而&#xff0c;许多开发者在使用 Transactional 注解时&#xff0c;可能会遇到事务失效的问题&#xff0c;导致数据异常或业务逻辑错误。本文将深入分析 Spring Boot 中事务失效的常见原因&am…

Python-文件操作-StringIO和BytesIO-路径操作-shutil模块-csv,ini序列化和反序列化-argparse使用-学习笔记

序 欠4年前的一份学习笔记&#xff0c;献给今后的自己。 文件操作 冯诺依曼体系架构CPU由运算器和控制器组成 运算器&#xff0c;完成各种算数运算、逻辑运算、数据传输等数据加工处理 。 控制器&#xff0c;控制程序的执行 存储器&#xff0c;用于记忆程序和数据&#xff0c;例…

LLM的表征做减法的是什么,自然语言是一个矩阵,怎么进行减法的

LLM的表征做减法的是什么,自然语言是一个矩阵,怎么进行减法的 有个假设:就是最后一个词语融合了前面词语的信息 减法操作主要用于提取模型内部表征中的"诚实性"概念向量。具体来说,这是通过对比诚实和不诚实场景下的模型隐藏状态实现的。 import torch from t…

Java创建型模式---单例模式

单例模式基础概念单例模式是一种创建型设计模式&#xff0c;其核心思想是确保一个类仅有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。在 Java 中实现单例模式主要有以下关键点&#xff1a;私有构造函数 - 防止外部通过new关键字创建实例静态实例变量 - 类内部持有…

详解Kafka重平衡机制详解

Kafka 的重平衡机制&#xff08;Rebalance&#xff09;是确保消费者组内成员动态变化&#xff08;如新成员加入、现有成员退出或崩溃、订阅主题分区数变化&#xff09;时&#xff0c;分区所有权能合理、公平地重新分配的核心机制。其目标是保证所有分区都有消费者处理&#xff…

代码详细注释:文件IO在用户管理系统中的应用实践:C语言实现用户名查重与密码确认与支持日志记录的终端用户认证解决方案的注册登录系统

代码/* 作业增强版注册登录系统 - 带日志和安全性增强功能 */ #include <stdio.h> // 标准输入输出函数(printf, scanf等) #include <stdlib.h> // 标准库函数(exit, malloc等) #include <string.h> // 字符串处理函数(strcmp, strcspn等) #inc…

Go与JS无缝协作:Goja引擎实战之错误处理最佳实践

引言&#xff1a;当Go邂逅JavaScript 在现代软件开发中&#xff0c;跨语言协作已成为提升效率的关键。想象一下&#xff1a;用Go的高性能处理核心逻辑&#xff0c;同时用JavaScript的灵活性实现动态规则——这不再是梦想。Goja&#xff0c;这个纯Go语言实现的JavaScript引擎&am…

继承与多态:面向对象编程的两大支柱

引言&#xff1a;为什么必须掌握继承与多态&#xff1f; 在Java开发中&#xff0c;继承与多态是构建可扩展、易维护系统的基石&#xff1a; 继承&#xff1a;实现代码复用&#xff0c;建立清晰的类层次结构多态&#xff1a;提升代码灵活性&#xff0c;实现"编写一次&#…

2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--上篇

前言 我们在学习Flutter开发的过程中&#xff0c;永远都跳不过去的一个问题就是如何在MAC下开发并打包Flutter工程项目&#xff0c;但MAC开发首先要解决的问题就是我们一般技术人员的电脑都是WINDOWS操作系统&#xff0c;专门配置一台MAC的话成本又是不得不考虑的因素&#xf…

250708-Svelte项目从Debian迁移到无法联网的RHEL全流程指南

&#x1f4cc; 背景 在 Debian 上使用以下命令创建了一个 Svelte 项目&#xff1a; npm install -g sv npx sv create my-svelte-demo cd my-svelte-demo npm install npm run dev现在需要将该项目迁移到一台 无法联网的 RHEL 9.4 服务器 上运行&#xff0c;出现如下报错&…

力扣 hot100 Day39

118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> res(numRows);for (int i 0; i < numRows; i) {res[i].resi…

HuggingFists: 无代码处理复杂PDF

有过使用LLM搭建RAG或其它类知识系统的朋友一定会对文档数据的复杂多样性有着深刻的理解。各行各业的磁盘中都沉睡了数年到数十年的各类文档信息&#xff0c;包括&#xff1a;Doc、Docx、PPT、PDF、XLS、PNG、JPEG等各类格式。利用LLM激活这些数据价值的首要工作就是能够正确的…

Vue 3 框架实现理念、架构与设计哲学深度解析

第一部分&#xff1a;Vue 3 的起源&#xff1a;架构演进与设计哲学 Vue 3 的诞生并非一次简单的版本迭代&#xff0c;而是一场深刻的架构革命。它的出现是前端技术演进、应用规模扩张以及对更高性能和可维护性追求的必然结果。要全面理解 Vue 3 的各项实现理念&#xff0c;必须…

SQL Server使用存储过程导出数据到Excel实现方式

在SQL Server数据库管理中,存储过程作为预编译的T-SQL语句集合,能显著提升数据操作效率与安全性。将数据导出到Excel的需求广泛存在于报表生成、数据迁移等场景。本文详细解析四种通过存储过程实现数据导出的技术方案,涵盖代码实现、适用场景及优化策略,为不同业务需求提供…