Hive SQL 精進系列:PERCENTILE_APPROX 搞定分位數



一、引言

百分位數作為一種常用的統計指標,能夠幫助我們了解數據的分布情況。Hive SQL 提供了 percentile_approx 函數,用于近似計算百分位數。與精確計算百分位數的函數相比,percentile_approx 在處理大規模數據時具有更高的性能和更低的內存開銷。本文將詳細介紹 percentile_approx 函數的語法、應用場景以及使用時的注意事項。

二、percentile_approx 函數基礎

2.1 基本語法

percentile_approx 函數有兩種常見的調用形式:

-- 形式一:計算單個百分位數
percentile_approx(col, p [, accuracy])-- 形式二:計算多個百分位數
percentile_approx(col, array(p1, p2, ...) [, accuracy])

參數解釋

  • col:這是要進行計算的列名,代表了一組數值數據。該列的數據類型通常為數值類型,如 INTDOUBLE 等。
  • parray(p1, p2, ...)p 是一個介于 0 到 1 之間的小數,表示要計算的百分位數。例如,0.5 表示中位數。在第二種形式中,可以傳入一個數組,包含多個要計算的百分位數。
  • accuracy:可選參數,是一個正整數,用于控制近似計算的精度。默認值為 10000。accuracy 值越大,計算結果越接近精確值,但會增加計算時間和內存開銷;反之,accuracy 值越小,計算速度越快,但結果的近似程度可能會降低。

返回值

  • 當使用形式一時,函數返回一個近似的百分位數值。
  • 當使用形式二時,函數返回一個數組,數組中的元素依次為指定的各個百分位數的近似值。

簡單示例

假設我們有一個表 scores,包含學生的考試成績:

-- 創建示例表
CREATE TABLE scores (student_id INT,score DOUBLE
);-- 插入示例數據
INSERT INTO scores VALUES
(1, 85.0),
(2, 90.0),
(3, 78.0),
(4, 92.0),
(5, 88.0);-- 計算中位數(第 50 百分位數)
SELECT percentile_approx(score, 0.5) AS median_score FROM scores;-- 計算第 25、50 和 75 百分位數
SELECT percentile_approx(score, array(0.25, 0.5, 0.75)) AS percentiles FROM scores;

在第一個查詢中,我們計算了 score 列的中位數。在第二個查詢中,我們同時計算了第 25、50 和 75 百分位數,并將結果存儲在一個數組中。

三、應用場景

3.1 數據分析與報告

在數據分析和報告中,百分位數可以幫助我們了解數據的分布特征。例如,在分析員工的薪資數據時,我們可以計算不同百分位數的薪資,以了解薪資的分布情況。

-- 創建員工薪資表
CREATE TABLE employee_salaries (employee_id INT,salary DOUBLE
);-- 插入示例數據
INSERT INTO employee_salaries VALUES
(1, 5000.0),
(2, 6000.0),
(3, 7000.0),
(4, 8000.0),
(5, 9000.0),
(6, 10000.0),
(7, 11000.0),
(8, 12000.0),
(9, 13000.0),
(10, 14000.0);-- 計算第 25、50 和 75 百分位數的薪資
SELECT percentile_approx(salary, array(0.25, 0.5, 0.75)) AS salary_percentiles FROM employee_salaries;

通過這個查詢,我們可以得到員工薪資的第 25、50 和 75 百分位數,從而了解薪資的分布情況,例如是否存在薪資差距過大的問題。

3.2 數據清洗與異常值檢測

百分位數可以用于識別數據中的異常值。通常,我們可以將數據的第 5 和第 95 百分位數作為正常數據的范圍,超出這個范圍的數據可能是異常值。

-- 計算第 5 和第 95 百分位數
WITH percentiles AS (SELECT percentile_approx(score, array(0.05, 0.95)) AS score_percentiles FROM scores
)
-- 篩選出異常值
SELECT * FROM scores
WHERE score < (SELECT score_percentiles[0] FROM percentiles)OR score > (SELECT score_percentiles[1] FROM percentiles);

在這個示例中,我們首先計算了 score 列的第 5 和第 95 百分位數,然后篩選出超出這個范圍的成績,這些成績可能是異常值,需要進一步檢查和處理。

3.3 性能監控與優化

在性能監控中,百分位數可以幫助我們了解系統的性能表現。例如,在監控數據庫查詢的響應時間時,我們可以計算不同百分位數的響應時間,以了解系統的整體性能和波動情況。

-- 創建查詢響應時間表
CREATE TABLE query_response_times (query_id INT,response_time DOUBLE
);-- 插入示例數據
INSERT INTO query_response_times VALUES
(1, 100.0),
(2, 120.0),
(3, 150.0),
(4, 200.0),
(5, 250.0),
(6, 300.0),
(7, 350.0),
(8, 400.0),
(9, 450.0),
(10, 500.0);-- 計算第 90、95 和 99 百分位數的響應時間
SELECT percentile_approx(response_time, array(0.9, 0.95, 0.99)) AS response_time_percentiles FROM query_response_times;

通過計算第 90、95 和 99 百分位數的響應時間,我們可以了解系統在大多數情況下的響應時間,以及在極端情況下的響應時間,從而發現性能瓶頸并進行優化。

四、使用注意事項

4.1 數據類型要求

col 列的數據類型必須是數值類型,否則會導致函數計算結果不準確或拋出錯誤。在使用 percentile_approx 函數之前,需要確保數據類型的正確性。

4.2 精度與性能平衡

accuracy 參數用于控制近似計算的精度,但會影響計算性能。在處理大規模數據時,需要根據實際需求平衡精度和性能。如果對結果的精度要求不高,可以適當降低 accuracy 的值,以提高計算速度。

4.3 空值處理

如果 col 列中包含空值,percentile_approx 函數會自動忽略這些空值。但在某些情況下,空值可能會影響數據的分布和分析結果,需要在數據預處理階段進行適當的處理。

五、總結

Hive SQL 的 percentile_approx 函數為近似計算百分位數提供了一種高效的方法。通過合理使用該函數,我們可以在數據分析、數據清洗、性能監控等多個場景中了解數據的分布特征,發現異常值和性能瓶頸。通過深入理解和掌握 percentile_approx 函數的用法,可以更好地挖掘數據的價值,為決策提供有力支持。

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

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

相關文章

pytorch快速入門——手寫數字分類GPU加速

&#x1f451;主頁&#xff1a;吾名招財 &#x1f453;簡介&#xff1a;工科學碩&#xff0c;研究方向機器視覺&#xff0c;愛好較廣泛… ?&#x1f4ab;簽名&#xff1a;面朝大海&#xff0c;春暖花開&#xff01; pytorch快速入門——手寫數字分類GPU加速 一、tensor1&#…

【開源免費】基于SpringBoot+Vue.JS電商應用系統(JAVA畢業設計)

本文項目編號 T 242 &#xff0c;文末自助獲取源碼 \color{red}{T242&#xff0c;文末自助獲取源碼} T242&#xff0c;文末自助獲取源碼 目錄 一、系統介紹二、數據庫設計三、配套教程3.1 啟動教程3.2 講解視頻3.3 二次開發教程 四、功能截圖五、文案資料5.1 選題背景5.2 國內…

經歷過的IDEA+Maven+JDK一些困惑

注意事項&#xff1a;由于使用過程中是IDEA綁定好另外2個工具&#xff0c;所以報錯統一都顯示在控制臺&#xff0c;但要思考和分辨到底是IDEA本身問題導致的報錯&#xff0c;還是maven導致的 使用前的配置 編輯期 定義&#xff1a;指的是從open projects開始&#xff0c;到執行…

【推理】大模型ReasonGraph:推理路徑的可視化論文及代碼分析

ReasonGraph:推理路徑的可視化 ReasonGraph demo http://192.168.50.197:5001/ 作者的其他論文 ** ** LLM推理方法的相關工作

學習路之TP6 --重寫vendor目錄下的文件(服務覆蓋command---優點:命令前后一致)

學習路之TP6 --重寫vendor目錄下的文件 一、新建命令文件&#xff1a;二、復制修改&#xff1a;Server.php三、新建服務類&#xff1a;WorkmanService.php四、注冊服務五、運行效果 有需求要重寫vendor\topthink\think-worker\src\command\Server.php 以實現修改代碼 一、新建命…

【藍圖使用】繪制mesh頂點的法線

文章目錄 繪制法線Normal準備工作UE5資源制作藍圖制作 參考 繪制法線Normal 參考[1]打算用藍圖走一遍渲染管線&#xff0c;還是可以的 準備工作 Blender制作一個三個頂點的模型 要不要材質無所謂&#xff0c;就一個三個頂點的mesh即可&#xff0c;參考[2] 找到一個法線貼…

【算法學習之路】10.二叉樹

二叉樹 前言一.簡介二.題目123 前言 我會將一些常用的算法以及對應的題單給寫完&#xff0c;形成一套完整的算法體系&#xff0c;以及大量的各個難度的題目&#xff0c;目前算法也寫了幾篇&#xff0c;題單正在更新&#xff0c;其他的也會陸陸續續的更新&#xff0c;希望大家點…

AI軟件棧:推理框架(二)-Llama CPP1

Llama CPP的主要構造&#xff0c;GGUF和GGML為兩個主要部分&#xff0c;包括模型描述文件和模型參數存儲文件 文章目錄 GGUF構建圖讀取權重 GGUF llama.cpp 的作者 Georgi Gerganov 提出的新一代大模型描述文件 GPT-Generated Unified Format&#xff0c;繼承自GGML&#xff0…

CentOS 7 64 安裝 Docker

前言 在虛擬機中安裝 Docker 是一種常見的測試和開發環境搭建方式。通過在虛擬機上安裝 Docker&#xff0c;可以方便地創建和管理容器化應用&#xff0c;同時避免對宿主機系統造成影響。以下是在 CentOS 7 虛擬機中安裝 Docker 的詳細步驟。 1. 更新系統&#xff08;可以不操作…

Flutter_學習記錄_video_player、chewie 播放視頻

1. video_player 視頻播放 插件地址&#xff1a;https://pub.dev/packages/video_player 添加插件 導入頭文件 import package:video_player/video_player.dart;Android配置&#xff08;iOS不用配置&#xff09; 修改這個文件&#xff1a;/android/app/src/main/AndroidMani…

VSCode通過SSH免密遠程登錄Windows服務器

系列 1.1 VSCode通過SSH遠程登錄Windows服務器 1.2 VSCode通過SSH免密遠程登錄Windows服務器 文章目錄 系列1 準備工作2 本地電腦配置2.1 生成密鑰2.2 VS Code配置密鑰 3. 服務端配置3.1 配置SSH服務器sshd_config3.2 復制公鑰3.3 配置權限&#xff08;常見問題&#xff09;3.…

強大的數據庫DevOps工具:NineData 社區版

本文作者司馬遼太杰&#xff0c; gzh&#xff1a;程序猿讀歷史 在業務快速變化與數據安全日益重要的今天&#xff0c;生產數據庫變更管理、版本控制、數據使用是數據庫領域的核心挑戰之一。傳統的解決方式往往采用郵件或即時通訊工具發起審批流程&#xff0c;再通過堡壘機直連數…

離線服務器ollama新增qwen2:0.5b模型

離線服務器ollama新增qwen2:0.5b模型 Dify集成ollama前面已經介紹過離線服務器CentOS使用的docker安裝的ollama&#xff0c;其中在ollama中已經安裝了deepseek-r1:1.5b。目前的需求是需要再安裝一個qwen2:0.5b的模型&#xff0c;那么如何安裝呢&#xff1f; 1.首先在有網的服…

淺談StarRocks數據庫簡介及應用

StarRocks是一款高性能的實時分析型數據庫&#xff0c;專為復雜的SQL查詢提供極高的性能&#xff0c;尤其適用于數據分析場景。它是一款開源的新一代極速全場景MPP&#xff08;Massively Parallel Processing&#xff0c;大規模并行處理&#xff09;數據庫&#xff0c;致力于構…

Cadence學習筆記4

想到一個思路理解過程&#xff0c;記錄一下&#xff1a; 就是我在別的地方&#xff0c;前一天的那些 Lib 都不在了&#xff0c;突然發現自己好像就在 Cadence 中畫不了 PCB 了。這就引發了我思考在 Cadence 中如何進行繪制的一個整體的流程。 首先得有原理圖&#xff0c;那么原…

Linux--git

ok&#xff0c;我們今天來學習如何在Linux上建立鏈接git 版本控制器Git 不知道你?作或學習時&#xff0c;有沒有遇到這樣的情況&#xff1a;我們在編寫各種?檔時&#xff0c;為了防??檔丟失&#xff0c;更改 失誤&#xff0c;失誤后能恢復到原來的版本&#xff0c;不得不…

(七)Spring Boot學習——Redis使用

有部分內容是常用的&#xff0c;為了避免每次都查詢數據庫&#xff0c;將部分數據存入Redis。 一、 下載并安裝 Redis Windows 版的 Redis 官方已不再維護&#xff0c;你可以使用 微軟提供的 Redis for Windows 版本 或者 使用 WSL&#xff08;Windows Subsystem for Linux&a…

HarmonyOS NEXT 聲明式UI語法學習筆記-創建自定義組件

基礎語法概述 ArkTS的基本組成 裝飾器&#xff1a;用于裝飾類、結構、方法以及變量&#xff0c;并賦予其特殊含義。如上圖都是裝飾器&#xff0c;Component表示自定義組件&#xff0c;Entry表示表示自定義組件的入口組件&#xff0c;State表示組件中的狀態變量&#xff0c;當狀…

【ElasticSearch】學習筆記

一、lucene的組成 segment是一個具備完整搜索功能的最小單元。 多個segment組成了一個單機文本檢索庫lucene。 inverted index:倒排索引&#xff0c;用于快速根據關鍵詞找到對應的文章term index: 構建出關鍵詞的目錄樹&#xff0c;解決了term dictionary數據量過大&#xff…

SSL/TLS 1.2過程:Client端如何驗證服務端證書?

快速回顧非對稱加密和對稱加密 首先快速說一下非對稱加密和對稱加密。非對稱加密&#xff0c;就是有一個公鑰和私鑰(成對存在)。 公鑰對一段文本A加密得到文本B&#xff0c;只有對應的私鑰能對B解密得到A。 私鑰對一段文本C加密得到文本D&#xff0c;只有對應的公鑰能對D解密得…