【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;都依赖这个时钟频…