大數據學習(138)-Hive數據分析3

????🍋🍋大數據學習🍋🍋

🔥系列專欄: 👑哲學語錄: 用力所能及,改變世界。
💖如果覺得博主的文章還不錯的話,請點贊👍+收藏??+留言📝支持一下博主哦🤞


一、分組排序問題(Top N 變體)

1. 按多個條件排序并取 Top N

問題:查詢每個部門薪資最高且入職最早的前 2 名員工。
思路

  • 窗口函數中用?ORDER BY salary DESC, hire_date ASC?實現多條件排序。
  • 用?ROW_NUMBER()?生成唯一排名,避免并列。

代碼模板

WITH ranked_employees AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC, hire_date ASC) AS rankFROM employees
)
SELECT * FROM ranked_employees WHERE rank <= 2;
2. 動態 Top N(按分組比例取前 N%)

問題:查詢每個部門薪資前 10% 的員工。
思路

  • 用?NTILE(10)?將數據按薪資分為 10 組,取第 1 組。

代碼模板

WITH salary_tiles AS (SELECT *,NTILE(10) OVER (PARTITION BY dept_id ORDER BY salary DESC) AS salary_tileFROM employees
)
SELECT * FROM salary_tiles WHERE salary_tile = 1;

二、連續區間問題(變體)

1. 連續缺失值檢測

問題:檢測用戶登錄記錄中連續缺失超過 3 天的區間。
思路

  • 生成完整日期序列,左連接實際記錄,標記缺失日期。
  • 用?日期-行號?分組連續缺失區間。

代碼模板

WITH all_dates AS (-- 生成日期序列(略)
),
missing_dates AS (SELECT user_id,date,CASE WHEN login_id IS NULL THEN 1 ELSE 0 END AS is_missingFROM all_datesLEFT JOIN user_logins USING (user_id, date)
),
missing_groups AS (SELECT user_id,date,DATE_SUB(date, ROW_NUMBER() OVER (PARTITION BY user_id, is_missing ORDER BY date)) AS grpFROM missing_datesWHERE is_missing = 1
)
SELECT user_id,MIN(date) AS start_date,MAX(date) AS end_date,COUNT(*) AS missing_days
FROM missing_groups
GROUP BY user_id, grp
HAVING COUNT(*) > 3;
2. 周期性行為識別

問題:識別用戶每周固定某天的登錄習慣(如每周三)。
思路

  • 用?DAYOFWEEK()?獲取星期幾,按用戶和星期分組統計頻次。

代碼模板

SELECT user_id,DAYOFWEEK(login_date) AS day_of_week,COUNT(*) AS login_count,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY COUNT(*) DESC) AS rank
FROM user_logins
GROUP BY user_id, DAYOFWEEK(login_date)
HAVING rank = 1;  -- 取頻次最高的一天

三、復雜聚合問題

1. 分組內條件聚合(加權平均)

問題:計算每個商品在不同促銷活動下的加權平均銷量(權重為活動持續天數)。
思路

  • 用?SUM(銷量*權重)/SUM(權重)?實現加權平均。

代碼模板

SELECT product_id,SUM(sales * duration_days) / SUM(duration_days) AS weighted_avg_sales
FROM (SELECT product_id,campaign_id,SUM(daily_sales) AS sales,DATEDIFF(end_date, start_date) + 1 AS duration_daysFROM sales_recordsGROUP BY product_id, campaign_id, start_date, end_date
) t
GROUP BY product_id;
2. 動態區間聚合(按事件觸發)

問題:計算用戶每次登錄后 24 小時內的消費總額。
思路

  • 用?JOIN?關聯同一用戶的登錄和消費記錄,篩選時間窗口。

代碼模板

SELECT l.user_id,l.login_time,SUM(o.amount) AS total_spent
FROM user_logins l
LEFT JOIN orders o 
ON l.user_id = o.user_id 
AND o.order_time BETWEEN l.login_time AND DATE_ADD(l.login_time, 1)
GROUP BY l.user_id, l.login_time;

四、多維分析(OLAP 風格)

1. 小計與總計(GROUPING SETS/CUBE/ROLLUP)

問題:同時計算按部門、職位和兩者組合的薪資總和。
思路

  • 用?GROUPING SETS?生成多種分組組合。

代碼模板

SELECT dept_id,position,SUM(salary) AS total_salary
FROM employees
GROUP BY GROUPING SETS((dept_id, position),  -- 部門+職位分組(dept_id),            -- 部門分組(position),           -- 職位分組()                    -- 總計
);
2. 同比 / 環比(跨時間周期比較)

問題:計算 2023 年每月銷售額的同比和環比增長率。
思路

  • 用?LAG()?獲取上月 / 去年同月數據,或用?JOIN?關聯時間偏移表。

代碼模板

WITH monthly_sales AS (SELECT YEAR(sale_date) AS sale_year,MONTH(sale_date) AS sale_month,SUM(amount) AS total_amountFROM salesGROUP BY YEAR(sale_date), MONTH(sale_date)
)
SELECT curr.sale_year,curr.sale_month,curr.total_amount,prev_month.total_amount AS prev_month_amount,prev_year.total_amount AS prev_year_amount,(curr.total_amount - prev_month.total_amount) / prev_month.total_amount AS mom_growth,(curr.total_amount - prev_year.total_amount) / prev_year.total_amount AS yoy_growth
FROM monthly_sales curr
LEFT JOIN monthly_sales prev_month 
ON curr.sale_year = prev_month.sale_year 
AND curr.sale_month = prev_month.sale_month + 1
LEFT JOIN monthly_sales prev_year 
ON curr.sale_year = prev_year.sale_year + 1 
AND curr.sale_month = prev_year.sale_month;

五、地理信息與空間分析

1. 區域聚合(按地理邊界統計)

問題:統計每個城市商圈內的店鋪數量。
思路

  • 用?ST_Contains()?判斷點(店鋪)是否在多邊形(商圈)內。

代碼模板

SELECT district_name,COUNT(shop_id) AS shop_count
FROM shops s
JOIN districts d 
ON ST_Contains(ST_GeomFromText(d.polygon_wkt),  -- 商圈多邊形ST_Point(s.longitude, s.latitude)  -- 店鋪坐標
)
GROUP BY district_name;
2. 距離最近點查詢

問題:為每個用戶找到距離最近的 3 個服務點。
思路

  • 用 Haversine 公式計算距離,ROW_NUMBER()?取 Top N。

代碼模板

WITH distances AS (SELECT u.user_id,s.service_id,6371 * 2 * ASIN(SQRT(POWER(SIN((s.lat - u.lat) * PI()/180 / 2), 2) +COS(u.lat * PI()/180) * COS(s.lat * PI()/180) *POWER(SIN((s.lon - u.lon) * PI()/180 / 2), 2))) AS distance_kmFROM users uCROSS JOIN service_points s
)
SELECT *
FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY distance_km) AS rankFROM distances
) t
WHERE rank <= 3;

六、時間窗口滑動聚合

1. 固定窗口聚合(每小時 / 每天)

問題:計算每小時的平均請求數。
思路

  • 用?DATE_TRUNC()?截斷時間到小時,按小時分組。

代碼模板

SELECT DATE_TRUNC('HOUR', request_time) AS hour,COUNT(request_id) AS request_count,AVG(response_time) AS avg_response_time
FROM requests
GROUP BY DATE_TRUNC('HOUR', request_time);
2. 滑動窗口聚合(過去 N 條記錄)

問題:計算每個用戶最近 5 次登錄的平均停留時長。
思路

  • 用?ROWS BETWEEN 4 PRECEDING AND CURRENT ROW?定義滑動窗口。

代碼模板

SELECT user_id,login_time,session_duration,AVG(session_duration) OVER (PARTITION BY user_id ORDER BY login_time ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS avg_last_5_sessions
FROM user_sessions;

七、數據透視與交叉表

1. 動態列轉置(不確定列數)

問題:將用戶標簽(每行一個標簽)轉為列(每個標簽一列)。
思路

  • 用?collect_set()?聚合標簽,size()?判斷是否存在。

代碼模板

WITH user_tags AS (SELECT user_id,collect_set(tag) AS tagsFROM user_tag_mappingGROUP BY user_id
)
SELECT user_id,CASE WHEN 'vip' IN (SELECT * FROM UNNEST(tags)) THEN 1 ELSE 0 END AS is_vip,CASE WHEN 'new' IN (SELECT * FROM UNNEST(tags)) THEN 1 ELSE 0 END AS is_new,-- 動態添加更多標簽判斷
FROM user_tags;
2. 交叉表統計(多維度組合)

問題:統計不同年齡段和性別用戶的消費金額分布。
思路

  • 用?CASE WHEN?組合維度,SUM()?聚合金額。

代碼模板

SELECT age_group,SUM(CASE WHEN gender = 'M' THEN amount ELSE 0 END) AS male_amount,SUM(CASE WHEN gender = 'F' THEN amount ELSE 0 END) AS female_amount,SUM(amount) AS total_amount
FROM users u
JOIN orders o USING (user_id)
GROUP BY age_group;

八、遞歸查詢與層級結構

1. 樹形結構路徑查詢(如組織架構)

問題:查詢員工及其所有上級的完整路徑。
思路

  • 用遞歸 CTE 逐層向上查找上級。

代碼模板

WITH RECURSIVE employee_hierarchy AS (SELECT emp_id,manager_id,emp_name,CAST(emp_name AS STRING) AS pathFROM employeesWHERE manager_id IS NULL  -- 根節點(CEO)UNION ALLSELECT e.emp_id,e.manager_id,e.emp_name,CONCAT(eh.path, ' -> ', e.emp_name) AS pathFROM employees eJOIN employee_hierarchy eh ON e.manager_id = eh.emp_id
)
SELECT * FROM employee_hierarchy;
2. 層級聚合(如區域銷售額匯總)

問題:計算每個區域及其子區域的總銷售額。
思路

  • 自下而上遞歸聚合,用?SUM() OVER (PARTITION BY region_id)

代碼模板

WITH region_sales AS (-- 基礎銷售額(略)
),
region_hierarchy AS (-- 區域層級關系(略)
),
recursive_sales AS (-- 遞歸計算子區域銷售額(略)
)
SELECT region_id,region_name,SUM(sales_amount) OVER (PARTITION BY region_id) AS total_sales
FROM recursive_sales;

九、字符串與模式匹配

1. 復雜字符串分割與提取

問題:從日志中提取?user_id?和?action(格式:[user_id:1001][action:click])。
思路

  • 用?regexp_extract()?或?substr()+instr()?提取子串。

代碼模板

SELECT regexp_extract(log_line, '\\[user_id:(\\d+)\\]', 1) AS user_id,regexp_extract(log_line, '\\[action:(\\w+)\\]', 1) AS action
FROM logs;
2. 字符串相似度計算

問題:找出商品名稱中包含特定關鍵詞的記錄。
思路

  • 用?LIKE?或?REGEXP?匹配,或用?levenshtein_distance()?計算編輯距離。

代碼模板

-- 方法1:模糊匹配
SELECT * FROM products WHERE product_name LIKE '%關鍵詞%';-- 方法2:正則匹配
SELECT * FROM products WHERE product_name REGEXP '關鍵詞';-- 方法3:相似度計算
SELECT * 
FROM products 
WHERE levenshtein_distance(product_name, '目標名稱') <= 3;

解題思路:

  1. 問題拆解:將復雜需求分解為子問題(如 “連續登錄” → “生成連續標識” → “分組統計”)。
  2. 數據建模:明確輸入輸出表結構,確定關聯字段和聚合維度。
  3. 技術選型
    • 窗口函數:排名、累計計算、滑動窗口。
    • JOIN:關聯多表數據,注意過濾條件前置。
    • 正則 / JSON 函數:處理復雜字符串和嵌套結構。
  4. 性能優化
    • 用?EXPLAIN?分析執行計劃,避免全表掃描。
    • 對大表 JOIN 考慮 MapJoin 或分桶表。
    • 過濾條件盡量前置,減少中間數據量。

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

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

相關文章

深度學習環境搭建(pycharm+yolov5)

B站 &#xff1a;道傳科技上位機 觀看教程 一、pycharm的安裝 pycharm windows版本下載地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 下載社區版本&#xff08;日常學習使用夠用了&#xff09;&#xff0c;專業版…

K8S中應用無法獲取用戶真實ip問題排查

現象 領導反饋生產環境的用戶ip有問題。登陸到這個頁面&#xff0c;發現是所有的用戶ip都是172.30.94.97&#xff0c;這是個內部網絡ip. 排查過程 1 登陸到應用前端nginx&#xff0c; 查看nginx的請求日志 172.30.94.97 - - [17/Jul/2024:02:02:54 0000] "POST /***/n…

2.倒排索引

傳統數據庫mysql使用的是正向索引 詞條是不允許重復的&#xff0c;給詞條創建唯一索引&#xff0c;根據詞條查找的速度就很快了。

【Android Studio】新建項目及問題解決

新建項目 按照《Android 第一行代碼》中 1.3 小節的步驟創建項目。 注意&#xff1a;Minimum API Level 用于設置項目的最低兼容版本。Android 5.0 以上的系統已經占據超過了 99.9% 的 Android 市場份額&#xff0c;因此這里指定為 API 21: Android 5.0 即可。 問題解決 &…

SX1268低功耗sub-1g芯片支持lora和GFSK調制

SX1268 射頻收發器是長距離無線應用的理想設備&#xff0c;支持410-810MHZ。它專為長電池壽命而設計&#xff0c;僅消耗4.2 mA的主動接收電流。SX1268 可以使用高效的集成功率放大器在490 MHz傳輸高達 22 dBm 的信號。在 780 MHZ時&#xff0c;SX1268 在天線端口傳輸10dBm的信號…

C#高級:利用反射讓字符串決定調用哪個方法

一、反射的實現 using System; using System.Reflection; using System.Threading.Tasks;public class Calculator {public int Add(int a, int b){return a b;}public int Subtract(int a, int b){return a - b;}public int Multiply(int a, int b){return a * b;}public do…

圖像二分類任務推薦使用Sigmoid函數?

?圖像二分類任務中可以使用Softmax作為激活函數&#xff0c;但通常更推薦使用Sigmoid函數?。Softmax函數可以將多個類別的輸出轉換成概率分布&#xff0c;適合多分類任務。在二分類任務中&#xff0c;雖然可以使用Softmax&#xff0c;但它會生成兩個輸出值&#xff08;每個類…

湖北理元理律師事務所:債務優化的法律邏輯與生活平衡術

在債務糾紛數量年均增長19%的背景下&#xff08;最高人民法院2023年數據&#xff09;&#xff0c;專業法律服務機構的價值不僅在于解決糾紛&#xff0c;更在于重構債務人與生活的平衡關系。湖北理元理律師事務所的實踐顯示&#xff0c;科學的債務優化需同時滿足三個維度&#x…

window 顯示驅動開發-處理視頻幀

Microsoft Direct3D 運行時調用用戶模式顯示驅動程序的 VideoProcessBeginFrame 和 VideoProcessEndFrame 函數&#xff0c;以指示用戶模式顯示驅動程序可以處理視頻幀的這些函數調用之間的時間段。 在用戶模式顯示驅動程序可以處理任何視頻幀之前&#xff0c;Microsoft Direct…

基于 React Native for HarmonyOS5 的跨平臺組件庫開發指南,以及組件示例

基于 React Native for HarmonyOS5 的跨平臺組件庫開發&#xff0c;需融合分層架構設計、鴻蒙原生能力橋接及性能優化技術&#xff0c;核心指南如下&#xff1a; ?一、分層架構設計? 采用 ?模塊化分層結構?&#xff0c;隔離平臺差異邏輯&#xff1a; ├── common_har …

一站式了解單例模式

引言 這是設計模式專欄的第一篇文章&#xff0c;在這個專欄里面會講到我們在開發中經常使用的設計模式&#xff0c;我會用心將它們解析&#xff0c;然后講給你們聽&#xff0c;如果感興趣可以持續關注這個專欄?? 這次我們要講的是單例模式&#xff0c;這個在大廠面試中十分…

Java應用Flink CDC監聽MySQL數據變動內容輸出到控制臺

文章目錄 maven 依賴自定義數據變化處理器flink cdc監聽驗證 maven 依賴 <properties><flink.version>1.14.0</flink.version><flink-cdc.version>2.3.0</flink-cdc.version></properties><dependencies><!-- Flink dependencie…

獵板厚銅PCB工藝能力如何?

在電子產業向高功率、高集成化狂奔的今天&#xff0c;電路板早已不是沉默的配角。當5G基站、新能源汽車、工業電源等領域對電流承載、散熱效率提出嚴苛要求時&#xff0c;一塊能夠“扛得住大電流、耐得住高溫”的厚銅PCB&#xff0c;正成為決定產品性能的關鍵拼圖。而在這條賽道…

業務:資產管理功能

文章目錄 一、項目背景1.1概述1.2編寫目的 二、注意點說明三、頁面效果四、代碼AssetManagementControllerHwinfoAssetManagementHwinfoAssetManagementServiceHwinfoAssetManagementServiceImplHwinfoAssetManagementMapperHwinfoAssetManagementMapper.xmlSfpAssetManagement…

【MySQL進階】MySQL程序

目錄 一.有哪些MySQL程序 二. mysqld —— MySQL服務器 三.mysql——MySQL客戶端 3.1.連接mysql客?端 3.2.mysql客戶端選項 3.2.1.mysql常用選項 3.2.2.在命令?中使?選項 3.3.MySQL 選項&#xff08;配置&#xff09;文件 3.3.1.Linux環境下默認配置文件的路徑 3.…

Docker 運行 Kafka 帶 SASL 認證教程

Docker 運行 Kafka 帶 SASL 認證教程 Docker 運行 Kafka 帶 SASL 認證教程一、說明二、環境準備三、編寫 Docker Compose 和 jaas文件docker-compose.yml代碼說明&#xff1a;server_jaas.conf 四、啟動服務五、驗證服務六、連接kafka服務七、總結 Docker 運行 Kafka 帶 SASL 認…

??CentOS 7.9?? 上配置 ??Fail2ban 自動封禁 IP?? 的完整步驟,整合了多篇權威資料的最佳實踐

&#x1f527; ??一、安裝 Fail2ban?? ??啟用 EPEL 倉庫?? yum install epel-release -y ??安裝 Fail2ban?? yum install fail2ban -y ??啟動并設置開機自啟?? systemctl start fail2ban systemctl enable fail2ban ?? 注意&#xff1a;CentOS 7.9 默認 Py…

損壞的RAID5 第十六次CCF-CSP計算機軟件能力認證

純大模擬 提前打好板子 我只通過4個用例點 然后就超時了。 #include<iostream> #include<cstring> #include<algorithm> #include<unordered_map> #include<bits/stdc.h> using namespace std; int n, s, l; unordered_map<int, string>…

Kafka Topic中的數據在消費后還存在嗎

在 Kafka 的主題(Topic)和分區(Partition)中,數據在被消費者消費后是否仍然存在,取決于 Kafka 的設計機制和配置策略。

Linuxkernel學習-deepseek-2

以下是國際上廣受好評的 Linux 內核權威公開課&#xff0c;均來自頂級高校和技術組織&#xff0c;附課程鏈接和特色說明&#xff1a; —### 一、殿堂級大學課程1. MIT 6.S081: Operating System Engineering - 核心&#xff1a;基于 RISC-V 架構 重寫 Unix 內核&#xff08;xv6…