【AI生成+補充】高頻 hql的面試問題 以及 具體sql

以下是高頻HQL面試題及對應SQL示例,涵蓋核心語法、優化技巧和典型場景,可直接用于面試準備:

一、基礎操作與DDL

1. 創建分區表 & 動態插入分區

sql

-- 創建外部分區表(按日期分區)
CREATE EXTERNAL TABLE logs (user_id STRING,event STRING,duration INT
) PARTITIONED BY (dt STRING)  -- 分區字段
STORED AS ORC
LOCATION '/user/hive/warehouse/logs';-- 動態插入分區(自動創建分區目錄)
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;INSERT INTO TABLE logs PARTITION (dt)
SELECT user_id, event, duration, event_date AS dt  -- 最后一列為分區字段
FROM raw_logs;

二、查詢優化

2. 分桶表創建 & SMB Join優化

sql

-- 創建分桶排序表(分桶數4,按user_id排序)
CREATE TABLE users_bucketed (user_id STRING,name STRING
) CLUSTERED BY (user_id) SORTED BY (user_id) INTO 4 BUCKETS
STORED AS ORC;-- 啟用SMB Join
SET hive.optimize.bucketmapjoin=true;
SET hive.auto.convert.sortmerge.join=true;SELECT /*+ MAPJOIN(b) */ a.user_id, a.event, b.name
FROM logs a JOIN users_bucketed b 
ON a.user_id = b.user_id;  -- 避免Shuffle

三、窗口函數實戰

3. 計算連續3天活躍用戶

sql

SELECT user_id
FROM (SELECT user_id,dt,LAG(dt, 2) OVER (PARTITION BY user_id ORDER BY dt) AS lag2  -- 取前2天的日期FROM logsWHERE event = 'active'
) t
WHERE datediff(dt, lag2) = 2;  -- 當前日期與前2天日期差2天(連續3天)
// add by me-方法二

SQL統計連續登陸3天的用戶(連續活躍超3天用戶)_sql連續登錄3天用戶數-CSDN博客
SELECT user_id,
? ? ? ? ?count(1) AS cnt
FROM?
? ? (SELECT user_id, DATE_SUB(dt,??rn) AS sub_date
? ? FROM?
? ? ? ? (SELECT user_id,??dt,??row_number() over( partition by user_id??ORDER BY ?dt) AS rn
? ? ? ? FROM logs) t
? ? ? ? GROUP BY ?user_id, sub_date

? ? ) diffTable
? ? GROUP BY ?user_id, sub_date
HAVING cnt >= 3

連續登陸(含間隔)

??ll???????https://zhuanlan.zhihu.com/p/29641524870

4. 分組Top N(部門工資前三)

sql

SELECT dept, name, salary
FROM (SELECT dept, name, salary,DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS rkFROM employees
) t
WHERE rk <= 3;
5,去除最大最小值求均值

https://zhuanlan.zhihu.com/p/28466428027

6.波峰波谷(快手)

https://zhuanlan.zhihu.com/p/1885646993512200080

7,AI無效oncall

https://zhuanlan.zhihu.com/p/1893678485387588081


四、數據傾斜解決方案

5. 大表Join傾斜Key打散

sql

-- 假設user_id='999'是傾斜Key
SELECT *
FROM (SELECT user_id,event,CASE WHEN user_id = '999' THEN concat(user_id, '_', rand())  -- 打散傾斜KeyELSE user_id END AS join_keyFROM logs
) a
JOIN users b
ON a.join_key = b.user_id;

五、高級函數與轉換

6. 行列轉換

sql

-- 行轉列(聚合多行)
SELECT user_id,CONCAT_WS(',', COLLECT_LIST(event)) AS events  -- 合并事件列表
FROM logs
GROUP BY user_id;-- 列轉行(拆分數組)
SELECT user_id, event_name
FROM logs
LATERAL VIEW EXPLODE(SPLIT(events, ',')) e AS event_name;  -- events是逗號分隔字符串
7. JSON解析

sql

SELECT get_json_object(json_col, '$.user.id') AS user_id,json_tuple(json_col, 'event', 'timestamp') AS (event, ts)  -- 同時解析多字段
FROM json_logs;

六、性能優化技巧

8. 謂詞下推優化

sql

-- 優化前(全表掃描)
SELECT * FROM logs WHERE dt = '2023-08-12' AND duration > 1000;-- 優化后(分區裁剪+列裁剪)
SELECT user_id, event  -- 只取所需列
FROM logs
WHERE dt = '2023-08-12'   -- 分區字段過濾AND duration > 1000;    -- ORC格式下自動謂詞下推
9. MapJoin手動指定

sql

SELECT /*+ MAPJOIN(small_table) */ big_table.id, small_table.name
FROM big_table 
JOIN small_table ON big_table.id = small_table.id;

七、場景題模板

10. 留存率計算(次日留存)

https://www.zhihu.com/question/294871305/answer/1903544000008417365

sql

SELECT a.dt,COUNT(DISTINCT a.user_id) AS dau,COUNT(DISTINCT b.user_id) AS next_day_retained,COUNT(DISTINCT b.user_id) / COUNT(DISTINCT a.user_id) AS retention_rate
FROM (SELECT dt, user_id FROM logs WHERE event='login' 
) a
LEFT JOIN (SELECT dt, user_id FROM logs WHERE event='login'
) b 
ON a.user_id = b.user_id
AND b.dt = DATE_ADD(a.dt, 1)  -- 次日留存
GROUP BY a.dt;

高頻考點總結

類型關鍵點
語法PARTITIONED BY?vs?CLUSTERED BYLATERAL VIEW explode()
窗口函數ROW_NUMBER()/RANK()/DENSE_RANK()LAG()/LEAD()ROWS BETWEEN
優化分區裁剪、列裁剪、MapJoin、SMB Join、隨機數打散傾斜Key
復雜類型處理COLLECT_LIST()/COLLECT_SET()get_json_object()
實戰場景留存率、連續登錄、Top N、UV/PV統計

提示:面試時務必說明優化原理(如?"SMB Join通過分桶排序避免Shuffle"),并強調數據傾斜處理經驗。

幾個關鍵函數

ROWS BETWEEN

sum(sales_volume) over(rows between 1 preceding and current row) sum_sales

sum(sales_volume) over(rows between current row and unbounded following)?

sum(sales_volume) over(rows between unbounded preceding and current row) sum_sales

sum(sales_volume) over(rows between current row and 2 following) sum_sales

sum(sales_volume) over(rows between 1 preceding and current row) sum_sales

LAG()/LEAD()

LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY sort_column)

LEAD(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY sort_column)

示例場景

假設有員工薪資表?emp,包含?ename(姓名)、job(職位)、sal(薪資)。

  • ?獲取前一行薪資?:LAG(sal, 1) OVER (ORDER BY sal)?可獲取當前行前一行薪資。 ?1
  • ?設置默認值?:LAG(sal, 1, 3.1415)?當前行無前一行數據時,默認返回3.1415。 ?1
  • ?連續性檢查?:通過?LAG(sal, 1)?與?LEAD(sal, 1)?組合,可驗證薪資是否連續。 ?24

ROW_NUMBER()/RANK()/DENSE_RANK()

dense_rank() over(partition by class order by pjs.sn_scores desc) as dense_rank
rank() over(partition by class?order by pjs.sn_scores desc) as rank
row_number() over(partition by class?order by pjs.sn_scores desc) as row_number

假設學生成績表按分數降序排列:

  • ?ROW_NUMBER()?:1, 2, 3, 4, 5(完全按順序分配) ?12
  • ?RANK()?:1, 2, 2, 4(相同分數共享排名,后續跳過) ?15
  • ?DENSE_RANK()?:1, 2, 2, 3(相同分數仍保持連續排名) ?25

[ PARTITIONED BY ]?vs [?CLUSTERED BY ]

CLUSTERED BY(分桶表設置)


作用:在建表時指定數據的分桶規則,物理上把數據分到多個文件(桶)中。
示例:
????????CREATE TABLE table_name (col1 INT, col2 STRING)
????????CLUSTERED BY (col1) INTO 4 BUCKETS;
原理:Hive 會根據col1的哈希值將數據分散到 4 個桶中,查詢時可加速數據讀取。

SORTED BY(桶內排序設置)

作用:在建表時指定桶內數據的排序規則。
示例:
????????CREATE TABLE table_name (col1 INT, col2 STRING)
????????CLUSTERED BY (col1) SORTED BY (col2 ASC) INTO 4 BUCKETS;
應用:適合需要頻繁按col2過濾的場景,如時間字段。

DISTRIBUTED BY(MapJoin 優化)

作用:在INSERT OVERWRITE語句中控制數據分發,常用于優化 MapJoin。
示例:
????????INSERT OVERWRITE TABLE target_table
????????SELECT * FROM source_table
????????DISTRIBUTED BY (join_key);

PARTITIONED BY(分區表定義)

作用:創建分區表,數據按分區字段物理存儲在不同目錄中。
示例:
????????CREATE TABLE table_name (col1 INT, col2 STRING)
????????PARTITIONED BY (dt STRING);
查詢優化:

????????SELECT * FROM table_name WHERE dt = '2023-01-01'; -- 直接過濾分區目錄

上表來源:

HiveSQL 入門避坑指南:搞懂這些 “BY“,讓你的 SQL 少跑 80% 的冤枉路_hive cluster by作用-CSDN博客

LATERAL VIEW explode()

Hive之explode()函數和posexplode()函數和lateral view函數_lateral view explode函數-CSDN博客

Hive中的explode函數、posexplode函數與later view函數_hive explode-CSDN博客

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

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

相關文章

開源 Arkts 鴻蒙應用 開發(十七)通訊--http多文件下載

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Cloudflare Tunnel 使用SAAS回源加速配置教程

在使用 Cloudflare Tunnel 時,通過“主域名+加速域名”的聯動配置,既能隱藏內網 IP,又能優化訪問速度。本文以實際部署場景為例(主域名 zhuyuming.dpdns.org、加速域名 jiasu.dpdns.org),帶你一步步完成內網服務穿透(以 192.168.1.6:5555 網頁服務為例),實操性強,可直…

C++實戰

Ref deepwiki vuecruddllamma.cpp 目標 計劃實現一個C項目&#xff0c;前端用vue&#xff0c;后端用C和llama.cpp。實現可以進行邏輯功能和AI推理。

dify 調用本地的 stable diffusion api生成圖片的工作流搭建

Dify調用本地Stable Diffusion API的工作流搭建指南 核心架構 #mermaid-svg-ce029i4XFKrDzRgU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ce029i4XFKrDzRgU .error-icon{fill:#552222;}#mermaid-svg-ce029i4XFK…

【Web后端】Django、flask及其場景——以構建系統原型為例

一、Django 和 Flask 簡介 Django 是一個高級 Python Web 框架&#xff0c;提供了完整的“開箱即用”功能&#xff0c;包括 ORM、認證、管理后臺等&#xff0c;便于快速開發安全且可維護的網站。Flask 是一個輕量級 Python Web 框架&#xff0c;核心功能比較簡單&#xff0c;但…

飛算JavaAI:從智能調度到出行服務的全鏈路技術升級

免責聲明&#xff1a;此文章所有內容都是實驗測試數據 目錄一、智慧交通核心場景的技術突破1.1 交通態勢感知與智能預警系統1.2 公共交通智能調度系統1.3 一體化出行服務系統二、智慧交通系統效能升級實踐2.1 交通數據中臺構建結語&#xff1a;重新定義智慧交通技術邊界一、智慧…

vscode的wsl環境,ESP32驅動0.96寸oled屏幕

注意大小寫&#xff0c;wsl&#xff08;也就是linux環境&#xff09;嚴格區分大小寫。有幫助記得訂閱專欄點贊&#xff0c;當前不定期持續更新。 一、文件夾格式&#xff1a; project/ # 項目根目錄 ├─ main/ # 主程序文件夾 │ ├─ mai…

CodeBuddy AI Coding 企業場景落地實踐與思考

&#x1f449;目錄1 引言2 診斷團隊研發流程3 選擇合適的 AI CODING 工具4 團隊 AI 研發流程落地實踐5 全面 CodeBuddy &#xff0c;深入 CodeBuddy6 誠邀共建在 AI 浪潮席卷全球的今天&#xff0c;AI CODING 已經不是企業研發團隊的可選項&#xff0c;而是必選項。如果你是企業…

windows下hashcat使用gpu破解execl打開密碼

需要的軟件 1.hashcat &#xff1a;https://hashcat.net 2.john the ripper &#xff1a;https://www.openwall.com 獲取execl加密文件的Hash PS G:\dl\john-1.9.0-jumbo-1-win64\john-1.9.0-jumbo-1-win64\run> python .\office2john.py .\test6.xlsx test6.xlsx:$office$*…

SpringCloud -- Nacos詳細介紹

5. Nacos 5.1 Nacos介紹 Nacos 可以理解為微服務的“電話簿 遙控器”。它是阿里巴巴開源的一個核心工具&#xff0c;主要解決微服務架構中的兩大問題&#xff1a; 5.1.1 服務注冊與發現&#xff08;電話簿&#xff09; 服務注冊&#xff1a;當某個微服務&#xff08;比如“訂單…

【狂熱算法篇】探尋圖論幽徑之SPFA算法:圖論迷宮里的閃電尋徑者(通俗易懂版)

?????本篇帶大家探究的是SPFA算法&#xff1b;從基本理解&#xff0c;畫圖分析展示&#xff0c;再到最后的代碼實現&#xff0c;以及為何要這樣實現代碼&#xff0c;等一些細節問題做解釋&#xff0c;相關題型應用&#xff0c;非常值得喲&#xff0c;尤其是剛入門的小白學…

webrtc網頁一對一通話

基于flutter-webrtc-server做的更改&#xff0c;只使用網頁實現語音和視頻一對一通話&#xff0c;不支持多對多。 項目地址: https://github.com/chging/rtc-server

Java調用bat執行python腳本

1、問題概述&#xff1f;在windows環境中可以通過Java調用bat執行文件&#xff0c;從而調用python腳本&#xff0c;使用起來方便。2、實現方式&#xff1f;2.1、核心代碼bat文件可以在任意位置//獲取文件在項目中的文職 String batFilePathSystem.getProperty("user.dir&q…

JavaWeb 歡迎頁設置詳解

JavaWeb 歡迎頁設置詳解 歡迎頁&#xff08;Welcome Page&#xff09;是用戶訪問 Web 應用根目錄時自動展示的默認頁面。在 JavaWeb 中有多種配置方式&#xff1a;一、配置方式 1. 通過 web.xml 配置&#xff08;傳統方式&#xff09; <web-app><!-- 配置歡迎頁列表 -…

反射和類加載機制

一 類加載機制 1.1 加載機制簡介 Java程序從編寫到運行這個過程大致可以分為兩個階段&#xff1a;編譯階段和運行階段。 編譯階段指的是&#xff0c;java源代碼文件**(*.java)被java編譯器&#xff08;javac&#xff09;編譯成字節碼文件(*.class)**的過程。這個過程不需要直接…

在CentOS 7 上安裝 MySQL 數據庫

文章目錄前言一、使用官方 MySQL 倉庫安裝 MySQL1.1 下載并安裝 MySQL 官方 YUM 倉庫1.2 安裝 MySQL YUM 倉庫1.3 安裝 MySQL1.3.1 補充&#xff1a;1.4 啟動 MySQL 服務1.5 設置 MySQL 服務開機啟動1.6 獲取臨時 root 密碼1.7 配置 MySQL1.7.1 注意事項1.8 完成安裝二、使用默…

Linux:套接字

從進程的視角來看&#xff0c;網絡通信就是一個主機上的進程和另外一個主機上的進程進行信息傳遞&#xff0c;因此對于操作系統而言&#xff0c;網絡通信就是一種進程間通信的方式。不過這種進程間通信有特殊之處&#xff1a;同一臺主機下可以通過進程ID來標識一個唯一的進程&a…

Android init.rc詳解3

關于Android Init的詳解&#xff0c;關于Action&#xff0c;Service&#xff0c;Trigger的請參考Android init.rc詳解1&#xff0c;關于Options的請參考Android init.rc詳解2&#xff0c;本章將介紹常見的Commands。 1 Commands bootchart [start|stop] 啟動或停止bootcharti…

Sentinel原理之規則管理

文章目錄1. 基礎知識2. 數據源使用2.1 RedisDatasource2.2 ZookeeperDatasource1. 基礎知識 流量控制規則&#xff08;FlowRule&#xff09;&#xff1a; 閾值類型grade&#xff1a; 0&#xff08;并發線程數&#xff09;&#xff1a;限制同時處理請求的線程1&#xff08;QPS…

系統時鐘配置

STM32F103C8T6的系統時鐘配置成72MHZ1. 什么是 STM32 系統時鐘系統時鐘&#xff08;System Clock&#xff09;是整個 MCU&#xff08;微控制器&#xff09;運行的“節拍信號”&#xff0c;所有 CPU 指令執行、外設操作、定時器計時、總線數據傳輸等&#xff0c;都依賴這個時鐘頻…