Spark SQL架構及高級用法

Spark SQL 架構概述

架構核心組件
  • API層(用戶接口)

    • 輸入方式:SQL查詢;DataFrame/Dataset API。
    • 統一性: 所有接口最終轉換為邏輯計劃樹(Logical Plan),進入優化流程。
  • 編譯器層(Catalyst 優化器)

    • 核心引擎: 基于規則的優化器(Rule-Based Optimizer, RBO)與成本優化器(Cost-Based Optimizer, CBO)。

    • 處理流程:

      階段輸入輸出關鍵動作
      解析SQL/API 操作未解析邏輯計劃構建語法樹(AST),校驗語法正確性
      分析未解析邏輯計劃解析后邏輯計劃綁定元數據(表/列名、數據類型)、解析函數、檢查語義正確性
      優化解析后邏輯計劃優化后邏輯計劃應用優化規則(如謂詞下推、列剪裁、常量折疊、連接重排序)
    • 優化規則示例:

      Predicate Pushdown(謂詞下推):將過濾條件推至數據源層,減少 I/O。

      Column Pruning(列裁剪):僅讀取查詢涉及的列,減少數據傳輸。

  • 執行計劃層(Planner)

    • 物理計劃生成:將優化后的邏輯計劃轉換為物理計劃(Physical Plan)

    • 策略匹配: 根據數據分布、資源情況選擇最優執行策略(如 BroadcastHashJoin vs SortMergeJoin)。

    • 物理優化:

      全階段代碼生成(Whole-Stage Codegen):將多個操作合并為單個 JVM 函數,減少虛函數調用開銷。

      謂詞下推至數據源:支持 Parquet/ORC 等格式的過濾條件下推。

  • 執行引擎層(Tungsten + Spark Core)

    • Tungsten 引擎:

      堆外內存管理:避免 JVM GC 開銷,直接操作二進制數據。

      向量化計算:按列處理數據,提升 CPU 緩存命中率。

    • 分布式執行:

      物理計劃轉為 RDD DAG → 分解為 Stage → 調度 TaskExecutor 并行執行。

      利用 Spark Core 的血緣(Lineage)、內存管理、Shuffle 服務。

關鍵性能技術
  • Catalyst 優化器
    • 動態優化: 在邏輯計劃階段應用啟發式規則,減少冗余計算。
    • 自適應查詢(AQE, Spark 3.0+):運行時根據 Shuffle 數據量動態調整 Join 策略、分區數。
  • Tungsten 執行引擎
    • 內存效率: 緊湊二進制格式存儲數據,減少內存占用 50%+。
    • 代碼生成: 將查詢編譯為字節碼,性能接近手寫代碼。
  • 統一數據源接入
    • Data Source API V2: 支持擴展自定義數據源(如 Kafka、Cassandra),并實現下推優化。
graph LRA[SQL 查詢] --> B(Parser:生成語法樹)B --> C(Analyzer:解析元數據)C --> D(Optimizer:應用優化規則)D --> E(Planner:生成物理計劃)E --> F(Tungsten:代碼生成+內存優化)F --> G(Spark Core:分布式執行)

Spark SQL高級語法

復雜數據類型
  • 數組 (ARRAY):同類型元素的有序集合(索引從0開始)。

    • size():數組長度。
    • explode():展開數組為多行。
    • array_contains(arr, value):檢查元素是否存在。
    • transform(arr, x -> x * 2):對每個元素應用Lambda函數。
  • 映射(MAP<K,V>):鍵值對集合(鍵唯一)。

    • element_at(map, key):按鍵取值。

    • map_keys()/map_values():獲取所有鍵/值。

    • map_concat(map1, map2):合并兩個Map。

  • 結構體 (STRUCT<field1:T1, ...>):包含多個字段的復合類型(類似JSON對象)。

高級聚合與分組
  • GROUPING SETS:自定義聚合維度組合,無關字段用NULL值填充。

    SELECT city, department, SUM(salary) AS total_salary
    FROM employees
    GROUP BY GROUPING SETS ((city, department), (city), ()                  
    )
    
  • ROLLUP:層級聚合

    SELECT country, province, city,COUNT(*) AS count
    FROM locations
    GROUP BY ROLLUP(country, province, city)
    -- SQL結果會顯示(country, province, city)、(country, province)、(country)、()的聚合結果
    
  • CUBE:所有維度聚合

    SELECT year, product, SUM(revenue) 
    FROM sales
    GROUP BY CUBE(year, product)
    -- SQL結果會顯示(year, profucr)、(year)、(product)、()的聚合結果
    
  • 聚合過濾(FILTER 子句):對特定條件聚合 (比WHERE更高效)

    SELECT department,SUM(salary) FILTER (WHERE age > 30) AS senior_salary,AVG(salary) FILTER (WHERE gender = 'F') AS female_avg
    FROM employees
    GROUP BY department
    
窗口函數
  • 核心結構

    SELECTRANK() OVER (PARTITION BY dim ORDER BY metric DESCROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 窗口范圍) AS rank
    FROM table
    
  • 聚合函數:**SUM()、AVG()、COUNT()、MAX()、MIN()**等

  • 排名函數

    • ROW_NUMBER():為窗口內的每一行分配一個唯一的序號,序號連續且不重復。
    • RANK():排名函數,允許有并列的名次,名次后面會出現空位。
    • ENSE_RANK():排名函數,允許有并列的名次,名次后面不會空出位置,即序號連續。
  • 分組窗口函數

    • NTILE():將窗口內的行分為指定數量的組,每組的行數盡可能相等。
  • 分布窗口函數

    • PERCENT_RANK():計算每一行的相對排名,返回一個介于0到1之間的值,表示當前行在分區中的排名百分比。
    • CUME_DIST():計算小于或等于當前行的行數占窗口總行數的比例。
  • 取值窗口函數

    • LAG():訪問當前行之前的第n行數據。
    • LEAD():訪問當前行之后的第n行數據。
    • FIRST_VALUE():獲取窗口內第一行的值。
    • LAST_VALUE():獲取窗口內最后一行的值。
    • NTH_VALUE():獲取窗口內第n行的值,如果存在多行則返回第一個。
  • 窗口范圍

    • UNBOUNDED PRECEDING:從分區中的第一行開始(前面所有行)。
    • CURRENT ROW:包括當前行。
    • N PRECEDING:從當前行之前的第 nN行開始。
    • N FOLLOWING:包括當前行之后第 N 行。
    • UNBOUNDED FOLLOWING:到分區中的最后一行結束(后面所有行)。
Spark SQL內置函數
  • 聚合函數 (Aggregate Functions)

    函數返回值說明
    approx_count_distinctLong近似去重計數 (rsd=相對誤差)
    collect_listArray收集值到數組 (保留重復)
    collect_setArray收集值到集合 (去重)
    corrDouble相關系數 (-1~1)
    covar_pop/covar_sampDouble總體/樣本協方差
    kurtosisDouble峰度
    skewnessDouble偏度
    percentile_approxDouble近似百分位數
  • 數組函數 (Array Functions)

    函數說明
    array(e1, e2, …)轉換為數組
    array_contains(arr, val)數組包含
    array_distinct數組去重
    array_position(arr, val)數組索引值
    size數組大小
  • Map 函數 (Map Functions)

    函數說明
    map(k1,v1, k2,v2)轉化為map
    element_at(map, key)根據鍵獲取值
    map_keys/map_values獲取鍵列表、值列表
    map_entries獲取map entry
  • 日期時間函數 (Datetime Functions)

    函數說明示例
    date_add/date_sub日期加減date_add('2025-07-01', 7)2025-07-08
    datediff日期差datediff('2025-06-01','2025-06-30')30
    date_format格式化date_format(ts, 'yyyy-MM')"2025-07"
    trunc截斷日期trunc('2025-07-01', 'MONTH')2025-07-01
    window時間窗口流處理中按時間聚合
  • JSON 函數 (JSON Functions)

    函數說明示例
    get_json_objectJSON路徑取值get_json_object('{"a":1}', '$.a')1
    json_tuple多字段提取json_tuple('{"name":"Bob"}', 'name')Bob
    from_json解析為結構體from_json('{"id":1}', 'id INT')
    to_json結構體轉JSONto_json(struct('Tom' AS name))'{"name":"Tom"}'
    schema_of_json推斷Schemaschema_of_json('[{"a":1}]')ARRAY<STRUCT<a:INT>>
  • 字符串函數 (String Functions)

    函數說明示例
    concat_ws字符串拼接joinconcat_ws('-','2025','07')"2025-07"
    split字符串解析轉數組split('a,b,c', ',')["a","b","c"]
    regexp_extract正則表達式regexp_extract('id=100','id=(\\d+)',1)"100"
    translate字符串子串轉化translate('hello','el','ip')"hippo"
    parse_url解析URLparse_url('http://a.com?q=spark','QUERY')"q=spark"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87578.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習深度學習】什么是下游任務模型?

目錄 前言 一、什么是下游任務模型&#xff1f; 二、為什么需要下游任務模型&#xff1f; 三、下游任務模型都在干嘛&#xff1f; 四、下游模型怎么訓練出來的&#xff1f; 五、圖解理解&#xff1a;上游 vs 下游 六、一個現實案例&#xff1a;BERT做情感分析 原始數據…

補充:問題:CORS ,前后端訪問跨域問題

補充&#xff1a;問題&#xff1a;CORS &#xff0c;前后端訪問跨域問題 我這邊的解決方法是&#xff1a; myAxios.defaults.withCredentials true; // 配置為true&#xff0c;表示前端向后端發送請求的時候&#xff0c;需要攜帶上憑證cookie整體的&#xff1a; import axio…

洛谷 P13014 [GESP202506 五級] 最大公因數-普及-

題目描述 對于兩個正整數 a,ba,ba,b&#xff0c;他們的最大公因數記為 gcd?(a,b)\gcd(a,b)gcd(a,b)。對于 k>3k > 3k>3 個正整數 c1,c2,…,ckc_1,c_2,\dots,c_kc1?,c2?,…,ck?&#xff0c;他們的最大公因數為&#xff1a; gcd?(c1,c2,…,ck)gcd?(gcd?(c1,c2,……

前端-CSS-day1

目錄 1、初識CSS 2、CSS引入方式 3、標簽選擇器 4、類選擇器 5、id選擇器 6、通配符選擇器 7、畫盒子 8、字體大小 9、字體粗細 10、字體傾斜 11、行高 12、行高-垂直居中 13、字體族 14、font屬性 15、文本縮進 16、文本對齊方式 17、圖片對齊方式 18、文本…

解鎖萬能文件內容提取器:Apache Tika

01 引言 在日常工作中&#xff0c;你是否曾為這些場景頭疼過&#xff1f; 堆積如山的PDF、Word、Excel文檔&#xff0c;如何快速提取關鍵信息&#xff1f;用戶上傳的文件五花八門&#xff0c;如何自動識別類型并安全處理&#xff1f;構建搜索引擎時&#xff0c;如何讓系統“讀懂…

gemini-cli初體驗

目錄 準備配置環境變量運行使用基礎使用配置MCP調用MCP 參考 準備 NodeJS 18版本 配置環境變量 設置GEMINI_API_KEY 變量&#xff0c;在https://aistudio.google.com/apikey創建key 設置代理&#xff08;可選&#xff0c;取決于您的網絡&#xff09;,不配置可能會報錯 api e…

Java --類變量和類方法--main語句

1. 類變量和類方法 介紹&#xff1a; 類變量也叫靜態變量/靜態屬性&#xff0c;是該類的所有對象共享的變量&#xff0c;任何一個該類的對象去訪問它時&#xff0c;取到的都是相同的值&#xff0c;同樣任何一個該類的對象去修改它時&#xff0c;修改的也是同一個變量。 語法…

spring boot項目配置使用minion

一. Minio概述 Minio是一款開源的高性能對象存儲服務,兼容Amazon S3 API,適用于私有云、混合云及邊緣計算場景。它采用分布式架構設計,支持水平擴展,提供數據加密、版本控制、生命周期管理等企業級功能,適用于存儲非結構化數據(如圖片、視頻、日志等)。 核心特性 S3兼…

<5>_Linux進程控制

目錄 一&#xff0c;進程創建&#xff0c;fork/vfork 1&#xff0c;fork創建子進程&#xff0c;操作系統都做了什么 2&#xff0c;寫時拷貝的做了什么 二&#xff0c;進程終止&#xff0c;echo $&#xff1f; 1&#xff0c;進程終止時&#xff0c;操作系統做了什么 2&…

阿里云服務器正確配置 Docker 國內鏡像的方法

&#x1f4e6; 原理說明&#xff1a;什么是“Docker 鏡像加速器”&#xff1f; Docker 默認會從官方倉庫 registry-1.docker.io 拉取鏡像。由于網絡原因&#xff0c;在中國大陸訪問這個地址較慢甚至失敗。 鏡像加速器的作用是&#xff1a; 在國內部署一個緩存服務器&#xf…

PH熱榜 | 2025-07-05

1. todai 標語&#xff1a;你的第一份個性化快樂生活指數 介紹&#xff1a;Todai 是你個人的人工智能助手&#xff0c;幫助你獲得心理清晰和情感平衡。你可以隨時隨地記錄自己的情緒&#xff0c;發現情緒變化的規律&#xff0c;并獲取基于科學的工具。 產品網站&#xff1a;…

c++ duiLib環境集成

duiLib的Github鏈接&#xff1a;https://github.com/duilib/duilib 使用vcpkg快速安裝duilib以及配置。步驟如下&#xff1a; 1、用git下載vcpkg&#xff0c;下載報錯&#xff0c;這個錯誤通常表明在Git克隆過程中&#xff0c;與GitHub服務器的SSL連接被意外重置。改用http下…

一項基于粒子圖像測速PIV系統的泥石流模擬沖擊實驗

1實驗背景 全國進入“七下八上”防汛關鍵期&#xff0c;泥石流作為山區常見地質災害&#xff0c;突發性強&#xff0c;破壞力大&#xff0c;對人民群眾生命財產安全造成威脅&#xff0c;傳統觀測手段難以實現對碎石運動軌跡與水流場耦合效應的精細觀測。而粒子圖像測速PIV技術…

ADAS功能介紹

ADAS功能介紹 ADAS&#xff08;Advanced Driving Assistance System&#xff09;高級駕駛輔助系統&#xff0c;可分為如下幾大類功能。 IA&#xff08;Information Assist&#xff09;信息輔助類 IA類功能&#xff0c;均不包含駕駛行為的控制。這些功能又可以進一步細分為三…

【LUT技術專題】CLUT代碼講解

本文是對CLUT技術的代碼講解&#xff0c;原文解讀請看CLUT文章講解。 1、原文概要 CLUT利用矩陣在保持3DLUT映射能力的前提下顯著降低了參數量。整體流程如下所示。 整體還是基于3D-LUT的框架&#xff0c;只不過添加了一個壓縮自適應的變換矩陣。作者使用的損失函數在3DLUT的…

在LinuxMint 22.1(Ubuntu24.04)上安裝使用同花順遠航版

剛剛在LinuxMint 22.1(Ubuntu24.04)安裝完成同花順遠航版&#xff0c;體驗特別好&#xff0c;忍不住要及時給深受Linux平臺無好用行情軟件之苦的朋友們進行分享了。在此之前我一直只能用同花順Linux原生版的行情軟件&#xff0c;但是該軟件只有很基本的行情功能&#xff0c;而且…

解決vue3路由配合Transition時跳轉導致頁面不渲染的問題

問題復現 <router-view v-slot"{ Component, route }"><transition name"fade" mode"out-in"><keep-alive><component :is"Component" :key"route.path" /></keep-alive></transition>…

java: 無法訪問org.springframework.boot.SpringApplication,類文件具有錯誤的版本 61.0, 應為 52.0

問題 java: 無法訪問org.springframework.boot.SpringApplication 錯誤的類文件: /D:/.m2/repository/org/springframework/boot/spring-boot/3.3.13/spring-boot-3.3.13.jar!/org/springframework/boot/SpringApplication.class 類文件具有錯誤的版本 61.0, 應為 52.0 請刪除…

Docker拉取nacos鏡像

以下是使用 Docker 拉取并運行 Nacos&#xff08;阿里巴巴開源的配置中心和服務發現組件&#xff09;鏡像的詳細指南&#xff1a; 1. 拉取 Nacos 官方鏡像 拉取最新版 Nacos 鏡像&#xff08;推薦指定版本以避免兼容性問題&#xff09;&#xff1a; # 拉取最新版本&#xff…

【CTF-Web環境搭建】kali

Kali虛擬機下載 這里在官網上下載下kali虛擬機Get Kali | Kali Linux 網速比較慢的話打開一下加速器 下載完成后 得到一個壓縮包 選擇一個合適的地方將這個壓縮包解壓一下 記住這個文件目錄 這里為了后續方便 簡歷一個叫做Virtual Machines的文件夾 里面就可以放不同的虛擬機…