Spark 4.0的 VariantType 類型優點以及使用分析

背景

本文基于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的需求廣泛存在于報表生成、數據遷移等場景。本文詳細解析四種通過存儲過程實現數據導出的技術方案,涵蓋代碼實現、適用場景及優化策略,為不同業務需求提供…