在大数据、数据开发与数据分析领域的面试中,扎实掌握各类知识点至关重要。以下是精心整理的面试题,涵盖单选题和多选题,助你备考一臂之力。
问题:数据仓库为何要分层?典型的分层结构有哪些?
答案:
数据仓库分层的核心目的是逻辑隔离、复用优化与性能提升。分层架构通过将数据处理流程拆解为多个职责明确的层级,实现以下目标:
分层优势:
问题:维度建模与范式建模的核心差异是什么?
答案:
维度建模 | 范式建模 |
---|---|
面向分析:适用于OLAP场景(如报表生成) | 面向事务:适用于OLTP系统(如订单交易) |
反规范化设计:事实表与维度表冗余关联 | 规范化设计:严格遵循3NF(如消除数据冗余) |
查询高效:减少JOIN操作(星型/雪花模型) | 写入高效:单表更新快,但查询需多表关联 |
示例:电商订单事实表直接关联用户、商品维度表 | 示例:订单表仅存储用户ID,需JOIN用户表获取详情 |
选择策略:
问题:简述MapReduce的Shuffle阶段核心流程。
答案:
Shuffle阶段是MapReduce的核心,负责数据分区、排序与传输,分为以下步骤:
优化点:
问题:Hive中数据倾斜的原因及解决方法有哪些?
答案:
原因:
解决方法:
CLUSTERED BY (user_id) INTO 100 BUCKETS
)。map.aggr=true
,在Map阶段局部聚合(如统计用户购买次数)。WHERE user_id IS NOT NULL
)。set mapreduce.job.reduces=N
手动设置合理分区数。user_id
转换为user_id_随机数
)。示例:
-- 优化前(数据倾斜)
SELECT user_id, COUNT(*) FROM orders GROUP BY user_id;
-- 优化后(Map端聚合)
SET map.aggr=true;
SELECT user_id, COUNT(*) FROM orders GROUP BY user_id;
问题:Spark为何比MapReduce快?
答案:
filter+map
合并),减少数据序列化/反序列化开销。性能对比:
场景 | MapReduce | Spark |
---|---|---|
迭代计算(如PageRank) | 多次磁盘读写 | 内存加速,快100倍 |
交互式查询 | 需重新执行Job | 缓存数据,秒级响应 |
问题:Flink如何通过Watermark处理乱序数据?
答案:
Watermark是时间戳标记,用于指示事件时间的进度,核心机制如下:
DataStream<Event> stream = ...;
stream.assignTimestampsAndWatermarks(
WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5))
.withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);
allowedLateness
参数(如允许延迟3秒),或使用sideOutputLateData
将迟到数据输出到侧输出流。应用场景:
问题:如何用窗口函数实现“连续登录≥3天的用户”?
答案:
表结构:user_login(user_id, login_date)
。
SQL解法:
WITH ranked_dates AS (
SELECT
user_id,
login_date,
DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) DAY) AS group_date
FROM user_login
),
counted_dates AS (
SELECT
user_id,
group_date,
COUNT(login_date) AS consecutive_days
FROM ranked_dates
GROUP BY user_id, group_date
)
SELECT user_id
FROM counted_dates
WHERE consecutive_days >= 3;
解析:
DATE_SUB
将连续日期转换为相同group_date
(如用户A的登录日期为2023-01-01、2023-01-02,group_date
均为2023-01-00)。user_id
和group_date
分组,统计每组天数。问题:数据倾斜的常见解决方法有哪些?
答案:
spark.sql.shuffle.partitions=200
)。user_id
→user_id_随机数
),先局部聚合再全局聚合。set hive.map.aggr=true
)。示例:
-- 随机前缀聚合优化
SELECT
REPLACE(key_col, '-random', '') AS key_col,
SUM(cnt) AS total
FROM (
SELECT
CASE WHEN key_col = 'hot_key' THEN CONCAT(key_col, '-', RAND()) ELSE key_col END AS key_col,
cnt
FROM original_table
) AS sub
GROUP BY key_col;
问题:如何在10亿个整数中高效去重?
答案:
Bitmap算法:
00
未出现,01
出现一次,10
多次出现)。2^32 * 2bit = 1GB
内存。00
。01
(首次出现)或10
(多次出现)。01
的数。优势:
问题:Flink如何管理状态以实现容错?
答案:
Flink通过Checkpoint机制实现状态的容错与恢复:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(1000); // 每1秒触发Checkpoint
最佳实践:
StateTtlConfig
),避免状态无限增长。问题:数据湖(Data Lake)与数据仓库(Data Warehouse)的本质区别是什么?
答案:
特性 | 数据湖 | 数据仓库 |
---|---|---|
数据结构 | 支持原始数据(结构化/半结构化/非结构化) | 严格结构化数据(表、列、Schema) |
存储方式 | 扁平存储(如HDFS、对象存储) | 分层存储(ODS/DWD/DWS/ADS) |
数据处理 | 存储后处理(Schema-on-Read) | 存储前处理(Schema-on-Write) |
应用场景 | 数据分析、机器学习(如日志、图片、JSON) | 报表生成、业务分析(如电商订单统计) |
数据质量 | 原始数据,质量参差不齐 | 清洗后高质量数据 |
核心差异:
最佳实践:
问题:数据治理包含哪些关键模块?如何落地实施?
答案:
数据治理是确保数据可用、可信、可控的体系,核心组件包括:
用户表中email字段非空率≥99%
。实施步骤:
问题:HBase适合存储什么样的数据?RowKey设计有哪些原则?
答案:
适用场景:
RowKey设计原则:
用户ID_时间戳
)。随机数_用户ID
,分散数据到不同RegionServer)。示例:
user_1001
(所有用户数据集中在user_
前缀的Region)。202310_1001_user
(按时间分区,减少跨Region查询)。问题:Hive中分区和分桶的作用是什么?如何选择?
答案:
特性 | 分区(Partition) | 分桶(Bucket) |
---|---|---|
目的 | 按维度分组(如按日期、地域) | 按Key哈希分片,均衡数据分布 |
数据存储 | 物理分目录(如/date=202310/ ) |
物理分文件(如part-00001 ) |
查询优化 | 缩小扫描范围(如WHERE date=202310 ) |
支持高效抽样(如TABLESAMPLE(BUCKET 1 OUT OF 10) ) |
适用场景 | 按维度过滤(如分析某天的订单数据) | 数据倾斜处理、JOIN优化(相同Bucket数据在同一Reducer) |
使用建议:
示例:
-- 分区表
CREATE TABLE orders (id STR, amount INT)
PARTITIONED BY (date STR);
-- 分桶表(按user_id分100桶)
CREATE TABLE user_log (user_id STR, action STR)
CLUSTERED BY (user_id) INTO 100 BUCKETS;
问题:Spark中窄依赖(Narrow Dependency)和宽依赖(Wide Dependency)的区别是什么?
答案:
核心定义:
区别对比:
特性 | 窄依赖 | 宽依赖 |
---|---|---|
数据传输 | 无需Shuffle,分区直接传输 | 需Shuffle,数据跨节点重组 |
容错成本 | 仅重算丢失的子分区(依赖父分区) | 需重算所有父分区(或依赖Checkpoint) |
优化空间 | 支持Pipeline优化(如合并算子) | 需通过分区数、并行度调优 |
应用场景:
代码示例:
# 窄依赖(Filter→Map)
rdd = sc.parallelize([1,2,3,4])
filtered = rdd.filter(lambda x: x > 2) # 窄依赖
mapped = filtered.map(lambda x: x * 2) # 窄依赖
# 宽依赖(GroupByKey)
grouped = mapped.groupByKey() # 宽依赖(Shuffle操作)
问题:Flink支持哪些窗口类型?如何选择?
答案:
Flink窗口分为时间窗口和计数窗口,核心类型如下:
一、时间窗口(Event Time/Processing Time)
DataStream<Order> orders = ...;
orders.keyBy(Order::getRegion)
.window(TumblingEventTimeWindows.of(Time.minutes(10)));
二、计数窗口
选择策略:
问题:如何评估数据质量?常用指标有哪些?
答案:
数据质量评估从准确性、完整性、一致性、及时性、唯一性、有效性六个维度展开:
实施工具:
问题:如何保障数据安全?常见技术手段有哪些?
答案:
数据安全从访问控制、数据加密、脱敏处理、审计监控四个层面实施:
GRANT SELECT ON TABLE orders TO ROLE analyst
。138****1234
处理)。-- Hive动态脱敏UDF示例
SELECT脱敏函数(phone_number) AS phone FROM user_info;
合规要求:
问题:数据开发中如何结合机器学习?举例说明。
答案:
机器学习在数据开发中可优化数据处理、提升数据价值,典型场景如下:
from sklearn.ensemble import IsolationForest
model = IsolationForest(contamination=0.01) # 1%异常数据
model.fit(clean_data)
predictions = model.predict(new_data) # -1为异常,1为正常
实施步骤:
问题:星型模型(Star Schema)和雪花模型(Snowflake Schema)的区别是什么?
答案:
特性 | 星型模型 | 雪花模型 |
---|---|---|
维度表设计 | 维度表不拆分(如用户维度表包含所有属性) | 维度表进一步拆分(如用户维度拆分为用户基本信息、用户地址表) |
规范化程度 | 反规范化(冗余存储维度属性) | 规范化(遵循3NF,减少冗余) |
查询性能 | 高(单表JOIN事实表,减少JOIN次数) | 低(多表JOIN,如用户→地址→省份) |
维护成本 | 低(维度表单一,更新方便) | 高(维度表拆分,需维护外键关系) |
适用场景:
示例:
事实表(订单) ——JOIN→ 维度表(用户:包含姓名、地址、电话)
事实表(订单) ——JOIN→ 用户基本信息表 ——JOIN→ 用户地址表
最佳实践:
数据仓库中优先使用星型模型,通过冗余换取查询性能;若维度表属性过多(如用户地址包含省/市/区),可局部雪花化(拆分地址维度)。
问题:HDFS的机架感知(Rack Awareness)机制如何优化数据存储?
答案:
HDFS通过机架感知机制实现数据的跨机架冗余存储,提升可靠性与读写性能,核心逻辑如下:
副本放置策略:
Node1(机架A)→ Node4(机架B)→ Node5(机架B)
,则机架B的故障不会导致数据丢失。性能优化:
实践场景:
问题:Combiner在MapReduce中的作用是什么?与Reducer有何区别?
答案:
Combiner的核心功能:
与Reducer的区别:
特性 | Combiner | Reducer |
---|---|---|
执行位置 | Map端(每个Map Task独立执行) | Reduce端(所有Reduce Task执行) |
输入输出 | Key-Value → Key-Value | Key-Value → Key-Value |
功能限制 | 仅能执行与Reducer相同的聚合逻辑 | 无限制,可执行复杂业务逻辑 |
典型场景 | 词频统计、求和、最大值计算 | 全局排序、跨Key聚合 |
代码示例:
// Combiner实现
public class WordCountCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
}
// 作业配置
job.setCombinerClass(WordCountCombiner.class);
问题:Spark广播变量(Broadcast Variable)如何优化数据传输?
答案:
原理:
适用场景:
val broadcastUser = spark.sparkContext.broadcast(userDF.collectAsList())
orderDF.map { case (orderId, userId) =>
val user = broadcastUser.value.find(_.id == userId).get
(orderId, user.name)
}
注意事项:
问题:Flink支持哪些状态后端?如何根据业务需求选择?
答案:
Flink的状态后端决定了状态的存储方式与性能,核心类型如下:
状态后端 | 存储介质 | 适用场景 | 优势 |
---|---|---|---|
MemoryStateBackend | 内存(JVM堆) | 小规模状态(如简单计数器) | 轻量级,低延迟 |
FsStateBackend | 文件系统(HDFS、本地磁盘) | 中等规模状态(如窗口聚合) | 支持Checkpoint持久化,适合长时间运行作业 |
RocksDBStateBackend | RocksDB(本地磁盘) | 超大规模状态(如千亿级实时聚合) | 高性能,支持增量Checkpoint(需配置) |
选择策略:
优化建议:
state.backend.incremental: true
),减少存储开销。问题:Kafka如何保证消息的幂等性?与事务的区别是什么?
答案:
幂等性(Idempotence):
事务(Transactions):
对比总结:
特性 | 幂等性 | 事务 |
---|---|---|
作用范围 | 单分区、单会话 | 多分区、跨会话 |
重复消息处理 | 单会话内去重 | 跨会话去重 |
性能影响 | 低(无需事务日志) | 高(需写入事务日志) |
适用场景 | 简单消息生产(如日志采集) | 复杂业务(如电商订单支付) |
问题:Hive的动态分区(Dynamic Partition)与静态分区(Static Partition)有何区别?
答案:
特性 | 动态分区 | 静态分区 |
---|---|---|
分区值指定方式 | 由查询结果动态生成(如INSERT OVERWRITE TABLE ... PARTITION(date) ) |
手动指定分区值(如PARTITION BY (date='2023-10-01') ) |
灵活性 | 自动创建新分区,适应数据变化 | 需提前创建分区,灵活性差 |
性能 | 可能导致小文件问题(需hive.exec.dynamic.partition.mode 设置为nonstrict ) |
分区明确,查询效率高 |
适用场景 | 数据按时间、地域等维度动态生成(如用户行为日志) | 分区值固定(如历史订单按年份存储) |
最佳实践:
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE user_log PARTITION(date)
SELECT user_id, action, date FROM raw_log;
INSERT INTO TABLE user_log PARTITION(date='2023-10-01')
SELECT user_id, action FROM raw_log WHERE date='2023-10-01';
问题:维度建模与范式建模的核心差异是什么?
答案:
特性 | 维度建模 | 范式建模 |
---|---|---|
设计目标 | 优化查询性能(OLAP场景) | 保证数据一致性(OLTP场景) |
数据冗余 | 高(反规范化,事实表与维度表冗余关联) | 低(严格遵循3NF,消除冗余) |
查询复杂度 | 低(单表JOIN,如星型模型) | 高(多表JOIN,如订单表关联用户表、商品表) |
适用场景 | 数据仓库(如Hive数仓) | 业务系统(如MySQL交易库) |
示例 | 电商订单事实表直接关联用户、商品维度表 | 订单表仅存储用户ID,需JOIN用户表获取详情 |
选择策略:
问题:如何用SQL窗口函数识别连续登录≥3天的用户?
答案:
表结构:user_login(user_id, login_date)
。
SQL解法:
WITH date_diff AS (
SELECT
user_id,
login_date,
DATEDIFF(login_date, LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date)) AS date_gap
FROM user_login
),
consecutive_days AS (
SELECT
user_id,
login_date,
SUM(CASE WHEN date_gap = 1 THEN 0 ELSE 1 END) OVER (PARTITION BY user_id ORDER BY login_date) AS group_id
FROM date_diff
)
SELECT user_id, COUNT(*) AS consecutive_days
FROM consecutive_days
GROUP BY user_id, group_id
HAVING COUNT(*) >= 3;
解析:
LAG(login_date)
获取前一条记录的登录日期,DATEDIFF
计算间隔天数。date_gap=1
(连续登录)时,SUM(CASE ...)
保持组ID不变;否则创建新组。user_id
和group_id
分组,筛选连续天数≥3的用户。优化点:
user_id
和login_date
上创建复合索引,加速排序与分组。问题:数据质量的核心评估指标有哪些?如何落地?
答案:
核心指标:
实施步骤:
SELECT COUNT(*) FROM user WHERE email IS NULL
)。工具推荐:
问题:数据安全的脱敏方法有哪些?动态脱敏与静态脱敏的区别是什么?
答案:
核心脱敏方法:
-- Hive静态脱敏UDF示例
SELECT脱敏函数(phone_number) AS phone FROM user_info;
// Flink动态脱敏示例
DataStream<User> users = ...;
users.map(user -> {
user.setPhoneNumber(desensitize(user.getPhoneNumber()));
return user;
});
动态脱敏与静态脱敏对比:
特性 | 动态脱敏 | 静态脱敏 |
---|---|---|
处理时机 | 查询时实时处理 | 数据入库前预处理 |
灵活性 | 高(可根据权限动态调整脱敏规则) | 低(规则固定,需重新入库) |
性能影响 | 高(每次查询需计算) | 低(预处理后不影响查询) |
适用场景 | 敏感数据按需展示(如客服查询用户信息) | 数据长期存储(如历史订单脱敏) |
合规要求:
问题:Hadoop的Secondary NameNode是否是NameNode的备份?其核心功能是什么?
答案:
误解澄清:
核心功能:
实施流程:
与NameNode的区别:
特性 | NameNode | Secondary NameNode |
---|---|---|
核心职责 | 管理HDFS元数据(内存+磁盘) | 合并元数据日志,生成检查点 |
数据存储 | 存储完整元数据(FsImage+Edit Logs) | 仅存储临时合并后的FsImage |
故障影响 | 单点故障导致集群不可用 | 不影响集群运行,仅影响元数据合并效率 |
最佳实践:
问题:Spark Shuffle过程中如何减少数据传输量?常用优化手段有哪些?
答案:
一、核心优化策略
reduceByKey
替代groupByKey
,在Map端提前聚合数据(如sum
、max
)。join
再groupBy
)。repartition
或coalesce
调整分区数(如spark.sql.shuffle.partitions=200
)。spark.shuffle.compress=true
和spark.shuffle.spill.compress=true
,减少网络传输量。二、代码示例
// 优化前:groupByKey触发Shuffle
val grouped = rdd.groupByKey()
// 优化后:reduceByKey在Map端聚合
val reduced = rdd.reduceByKey(_ + _)
// 动态调整分区数
val repartitioned = rdd.repartition(200)
三、参数调优
参数 | 作用 | 建议值 |
---|---|---|
spark.shuffle.memoryFraction |
Shuffle内存占比(0.2-0.4) | 0.3 |
spark.shuffle.io.maxRetries |
Shuffle失败重试次数 | 5 |
spark.shuffle.io.retryWait |
重试间隔(毫秒) | 500 |
最佳实践:
mapPartitions
替代map
)。问题:Flink的Checkpoint如何保证端到端的一致性?与Kafka的事务有何关系?
答案:
一、核心原理
二、与Kafka的集成
TwoPhaseCommitSinkFunction
实现事务性写入,确保数据仅提交一次。三、语义对比
语义 | Checkpoint机制 | Kafka事务 |
---|---|---|
作用范围 | Flink作业内部状态 | Kafka生产者到消费者 |
一致性保证 | Exactly-Once(作业级) | Exactly-Once(跨分区) |
依赖条件 | 数据源支持重放(如Kafka) | Kafka版本≥0.11.0 |
代码示例:
// Flink与Kafka集成
FlinkKafkaProducer<String> producer = new FlinkKafkaProducer<>(
topic,
new SimpleStringSchema(),
props,
FlinkKafkaProducer.Semantic.EXACTLY_ONCE
);
问题:Kafka的ISR(In-Sync Replicas)是什么?如何动态维护?
答案:
一、核心概念
replica.lag.time.max.ms
(默认10秒)内追上Leader的日志偏移量。replica.lag.time.max.ms
未同步,或落后Leader超过replica.lag.max.messages
(默认4000条),则被移出ISR。三、参数配置
参数 | 作用 | 建议值 |
---|---|---|
replica.lag.time.max.ms |
Follower最大滞后时间(毫秒) | 10000 |
min.insync.replicas |
写入时需满足的最小ISR成员数 | 2(推荐) |
最佳实践:
min.insync.replicas
设置为2,结合acks=all
保证数据可靠性。问题:数据倾斜的根本原因是什么?如何通过SQL或代码优化?
答案:
一、核心原因
COUNT(DISTINCT)
、JOIN
等操作未优化。二、解决方案
场景 | 方法 | 示例 |
---|---|---|
Key分布不均 | 加盐(随机前缀)打散数据 | SELECT * FROM table WHERE key = 'hot_key' + rand() |
JOIN倾斜 | 广播小表(Map端JOIN) | spark.conf.set("spark.sql.autoBroadcastJoinThreshold", 1048576) |
COUNT(DISTINCT) | 分桶聚合 | SELECT a, COUNT(DISTINCT b) FROM (SELECT a, b, rand() as r FROM table) GROUP BY a, r |
三、参数调优
hive.groupby.skewindata=true
(分两阶段聚合)。spark.sql.adaptive.enabled=true
(自适应执行)。代码示例:
-- Hive分桶聚合
SELECT a, COUNT(DISTINCT b)
FROM (
SELECT a, b, floor(rand() * 10) as bucket
FROM table
) t
GROUP BY a, bucket;
问题:湖仓一体(Lakehouse)与传统数据湖、数据仓库的区别是什么?
答案:
一、核心特性
二、对比分析
特性 | 传统数据湖 | 传统数据仓库 | 湖仓一体 |
---|---|---|---|
数据模型 | 无(Schema-on-Read) | 严格(Schema-on-Write) | 灵活(支持Schema演进) |
事务支持 | 无 | 支持 | 支持 |
实时分析 | 支持 | 不支持 | 支持 |
存储成本 | 低 | 高 | 低 |
三、典型场景
工具推荐:
问题:数据治理中如何通过元数据管理提升数据质量?
答案:
一、核心组件
二、实施工具
工具 | 功能 | 示例 |
---|---|---|
Apache Atlas | 元数据血缘分析、权限管理 | 自动发现Hive表的血缘关系 |
Great Expectations | 数据质量规则定义、监控 | 校验用户表的邮箱格式 |
阿里云数据治理中心 | 统一元数据管理、数据标准落地 | 定义用户ID的命名规范 |
三、实践价值
实施步骤:
问题:Flink的背压(Backpressure)是什么?如何监控和优化?
答案:
一、产生原因
二、监控方法
akka.actor.default-dispatcher-pending-tasks
指标。Backpressure
相关的警告日志。三、解决方案
方法 | 描述 | 示例 |
---|---|---|
增加并行度 | 提升下游算子的处理能力 | env.setParallelism(10) |
优化代码逻辑 | 减少算子处理时间(如异步调用) | 使用AsyncFunction 处理耗时操作 |
调整资源配置 | 增加内存或CPU资源 | 扩容Kubernetes集群节点 |
反压策略 | 启用背压机制(默认开启) | env.getConfig().setAutoWatermarkInterval(100) |
代码示例:
// 使用AsyncFunction优化异步调用
public class AsyncDatabaseRequest extends RichAsyncFunction<String, String> {
@Override
public void asyncInvoke(String input, ResultFuture<String> resultFuture) {
// 异步查询数据库
CompletableFuture.supplyAsync(() -> database.query(input))
.thenAccept(resultFuture::complete);
}
}
问题:如何设计一个高效的实时数仓?需要考虑哪些关键因素?
答案:
一、核心架构
二、关键设计要点
示例架构:
业务系统 → Kafka → Flink(清洗/聚合) → HBase(实时查询) → BI工具
历史数据 → Sqoop → HDFS → Spark(批处理) → Hive(离线分析)
问题:使用SQL窗口函数实现累计求和(如用户连续登录天数)和排名(如销售额Top10)。
答案:
一、累计求和(用户连续登录天数)
表结构:user_login(user_id, login_date)
。
SQL示例:
WITH date_diff AS (
SELECT
user_id,
login_date,
DATEDIFF(login_date, LAG(login_date) OVER (PARTITION BY user_id ORDER BY login_date)) AS date_gap
FROM user_login
),
consecutive_days AS (
SELECT
user_id,
login_date,
SUM(CASE WHEN date_gap = 1 THEN 0 ELSE 1 END) OVER (PARTITION BY user_id ORDER BY login_date) AS group_id
FROM date_diff
)
SELECT user_id, login_date,
COUNT(*) OVER (PARTITION BY user_id, group_id) AS consecutive_days
FROM consecutive_days;
二、排名(销售额Top10)
表结构:sales(product_id, amount)
。
SQL示例:
SELECT product_id, amount,
RANK() OVER (ORDER BY amount DESC) AS rank,
DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_rank
FROM sales;
三、窗口函数对比
函数 | 作用 | 示例 |
---|---|---|
ROW_NUMBER() |
生成唯一排名(无并列) | ROW_NUMBER() OVER (ORDER BY amount DESC) |
RANK() |
允许并列,跳过后续排名 | RANK() OVER (ORDER BY amount DESC) |
DENSE_RANK() |
允许并列,不跳过后续排名 | DENSE_RANK() OVER (ORDER BY amount DESC) |
优化点:
user_id
和login_date
上创建复合索引,加速排序与分组。问题:Kafka的副本机制如何保证数据不丢失?ISR的作用是什么?
答案:
一、副本机制
二、ISR(In-Sync Replicas)
replica.lag.time.max.ms
(默认10秒)内追上Leader的日志偏移量。replica.lag.time.max.ms
未同步则移出。三、数据可靠性保障
acks=all
:Leader等待所有ISR副本确认后才返回成功。参数配置:
min.insync.replicas
:设置写入时的最小ISR成员数(如min.insync.replicas=2
)。unclean.leader.election.enable
:禁止从非ISR副本选举Leader(默认false
)。问题:Flink的状态后端(MemoryStateBackend、FsStateBackend、RocksDBStateBackend)如何选择?
答案:
一、状态后端对比
状态后端 | 存储介质 | 适用场景 | 优势 |
---|---|---|---|
MemoryStateBackend | 内存(JVM堆) | 小规模状态(如简单计数器) | 轻量级,低延迟 |
FsStateBackend | 文件系统(HDFS、本地磁盘) | 中等规模状态(如窗口聚合) | 支持Checkpoint持久化,适合长时间运行作业 |
RocksDBStateBackend | RocksDB(本地磁盘) | 超大规模状态(如千亿级实时聚合) | 高性能,支持增量Checkpoint(需配置) |
二、选择策略
三、参数调优
state.backend.incremental: true
(RocksDB后端)。state.backend.rocksdb.memory.off-heap: true
(堆外内存优化)。代码示例:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new RocksDBStateBackend("hdfs://namenode:8020/flink/checkpoints"));
问题:数据治理的实施步骤是什么?如何落地?
答案:
一、核心流程
二、工具推荐
工具 | 功能 | 示例 |
---|---|---|
Apache Atlas | 元数据血缘分析、权限管理 | 自动发现Hive表的血缘关系 |
Great Expectations | 数据质量规则定义、监控 | 校验用户表的邮箱格式 |
Apache Griffin | 批量数据质量监控 | 检测订单表的金额异常 |
最佳实践:
问题:什么是CTE(Common Table Expression)?如何用CTE优化复杂查询?
答案:
一、CTE定义
WITH
子句定义临时结果集,可在后续查询中复用。二、示例应用
场景:统计每个用户的累计消费金额,并筛选累计金额超过1000元的用户。
WITH user_transaction AS (
SELECT user_id, SUM(amount) AS total_amount
FROM transactions
GROUP BY user_id
),
filtered_users AS (
SELECT user_id, total_amount
FROM user_transaction
WHERE total_amount > 1000
)
SELECT u.user_id, u.total_amount, t.transaction_date
FROM filtered_users u
JOIN transactions t ON u.user_id = t.user_id;
三、优势对比
特性 | CTE | 子查询 |
---|---|---|
可读性 | 高(命名临时结果集) | 低(嵌套层级深) |
复用性 | 支持多次引用 | 不支持(需重复编写) |
执行效率 | 与子查询相当(部分数据库优化) | 可能生成临时表 |
最佳实践:
WITH RECURSIVE
处理层级数据(如部门树结构)。问题:HBase的Region Split是什么?如何避免热点问题?
答案:
一、Region Split机制
split
强制分裂指定Region。二、优化策略
HexStringSplit
)。SplitPolicy
)。001_user_1001
),分散数据到不同Region。20240501_1001
),避免热点。hbase.hregion.max.filesize
:调整Region分裂阈值(如5GB)。hbase.hregion.memstore.flush.size
:控制MemStore刷写时机,避免频繁分裂。示例代码:
// 预分区
HBaseAdmin admin = new HBaseAdmin(conf);
byte[][] splits = HexStringSplit.generateHexSplits(10); // 生成10个哈希分区
admin.createTable(tableDesc, splits);
问题:星座模型(Galaxy Schema)与星型模型、雪花模型的区别是什么?
答案:
一、核心定义
二、对比分析
模型 | 结构 | 示例 |
---|---|---|
星型模型 | 单事实表关联多个维度表 | 订单事实表关联用户、商品、时间维度 |
雪花模型 | 维度表进一步拆分(如用户→地址→省份) | 用户表拆分出地址表,地址表拆分出省份表 |
星座模型 | 多事实表共享维度表 | 订单、支付事实表共享用户、时间维度 |
三、优势与局限
特性 | 优势 | 局限 |
---|---|---|
星型模型 | 查询性能高(JOIN次数少) | 冗余度高,维护成本低 |
雪花模型 | 规范化程度高,存储成本低 | 查询性能低(多层JOIN) |
星座模型 | 支持多业务线分析,复用维度表 | 复杂度高,设计难度大 |
最佳实践:
问题:Flink和Kafka如何协作实现端到端的Exactly-Once?
答案:
一、Flink的Checkpoint机制
二、与Kafka的集成
FlinkKafkaProducer
的EXACTLY_ONCE
语义,结合Kafka事务保证数据仅提交一次。三、实施步骤
env.enableCheckpointing(5000); // 每5秒触发一次Checkpoint
Properties props = new Properties();
props.setProperty("transaction.timeout.ms", "60000");
FlinkKafkaProducer<String> producer = new FlinkKafkaProducer<>(
topic,
new SimpleStringSchema(),
props,
FlinkKafkaProducer.Semantic.EXACTLY_ONCE
);
最佳实践:
问题:数据仓库分层的目的是什么?各层的典型应用场景有哪些?
答案:
一、分层架构
层次 | 作用 | 示例 |
---|---|---|
ODS(原始层) | 存储原始数据(如业务库全量同步) | 订单表、用户行为日志 |
DWD(明细层) | 清洗、规范化数据(如过滤脏数据、关联维度) | 剔除无效订单,关联用户信息 |
DWS(汇总层) | 按主题预聚合(如日活、交易额) | 用户日活统计、城市订单量 |
ADS(应用层) | 直接服务业务(如报表、API) | 运营日报、风控模型输入 |
二、核心目的
三、典型场景
最佳实践:
问题:如何用SQL递归查询(CTE)实现部门层级关系遍历?
答案:
一、表结构
CREATE TABLE department (
id INT PRIMARY KEY,
name VARCHAR(50),
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES department(id)
);
二、递归查询示例
WITH RECURSIVE department_tree AS (
SELECT id, name, parent_id, 0 AS level
FROM department
WHERE parent_id IS NULL -- 根节点
UNION ALL
SELECT d.id, d.name, d.parent_id, dt.level + 1
FROM department_tree dt
JOIN department d ON dt.id = d.parent_id
)
SELECT id, name, parent_id, level
FROM department_tree
ORDER BY level, id;
三、核心语法
WITH RECURSIVE
:启用递归查询。parent_id IS NULL
)。UNION ALL
连接子节点,逐层遍历。优化点:
parent_id
上创建索引,加速递归查询。WHERE level <= 5
避免无限递归。问题:动态脱敏与静态脱敏的区别是什么?如何在SQL中实现动态脱敏?
答案:
一、核心区别
特性 | 动态脱敏 | 静态脱敏 |
---|---|---|
处理时机 | 查询时实时处理 | 数据入库前预处理 |
灵活性 | 高(可按权限动态调整规则) | 低(规则固定,需重新入库) |
性能影响 | 高(每次查询需计算) | 低(预处理后不影响查询) |
适用场景 | 敏感数据按需展示(如客服查询用户信息) | 数据长期存储(如历史订单脱敏) |
二、SQL实现示例
表结构:user_info(user_id, name, phone, email)
。
动态脱敏:
-- 对手机号中间4位打码
SELECT
user_id,
name,
CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, 8, 4)) AS phone,
email
FROM user_info;
静态脱敏:
-- 入库前脱敏
INSERT INTO user_info_脱敏 (user_id, name, phone, email)
SELECT
user_id,
name,
CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, 8, 4)) AS phone,
email
FROM user_info_原始;
三、工具推荐
合规要求:
1.客户端请求上传:客户端向 NameNode 发送上传文件请求(如 /user/atguigu/ss.avi
),NameNode 检查目标目录是否存在、权限等,若允许则响应客户端。
2. 请求上传 Block:客户端请求上传第一个 Block(如 0 - 128M),NameNode 选择存储该 Block 的 DataNode(如 dn1、dn2、dn3)并返回给客户端。
3. 3. 建立传输通道:客户端向选中的第一个 DataNode(dn1)请求建立 Block 传输通道,dn1 再向 dn2 建立通道,dn2 向 dn3 建立通道,形成流水线。
4. 数据分包传输:客户端将数据按 Packet(64KB,每个 Packet 包含 512 字节数据块及 4 字节校验和)写入通道。数据依次流经 dn1、dn2、dn3,每个节点存储数据并向下一节点传输。
5. 应答确认:每个 DataNode 成功接收数据后返回应答。当一个 Block 传输完成,客户端重复上述步骤传输下一个 Block,直至整个文件写入完成。 此过程通过流水线方式提高写入效率,同时 NameNode 管理元数据,确保数据存储的可靠性与一致性。
以上题目覆盖Hadoop优化、Spark Shuffle原理、Flink容错机制、Kafka可靠性、数据倾斜处理、湖仓一体架构、数据治理、SQL高级应用等核心领域。建议结合具体业务场景(如实时数仓建设、用户行为分析)深入理解技术原理与最佳实践,提升面试中的问题分析能力。如需更多实战案例(如Flink状态管理、Kafka事务实现),可参考牛客网《大数据开发面试题500题》。
1. 统计图中的散点图主要用来( A )。
A. 观察变量之间的相关关系
B. 主要用来表示总体各部分所占的比例
C. 主要用来表示次数分布
D. 主要用来反映分类数据的频数分布
2. 抽样误差是指( D )
A. 在调查过程中由于观察、测量等差错所引起的误差
B. 人为原因所造成的误差
C. 在调查中违反随机原则出现的系统误差
D. 随机抽样而产生的代表性误差
3. 检查异常值常用的统计图形:( B )
A、条形图
B、箱体图
C、帕累托图
D、线图
4. 线性回归里的残差分析不可能用于诊断( D )
A、残差独立性
B、变量分布
C、异常值侦察
D、最大迭代次数
5. 拟合logistic回归模型时有两个分类变量,分别是Gender(水平为female和male),Class(水平为1 、2和3),下表为输出结果,下面哪个选项的说法是正确的?(C)
A. 变量Gender和Class采用效应编码
B. 变量Gender采用引用编码,引用水平为female
C. 变量Class采用引用编码,引用水平为3
D. 变量Gender和Class采用全量编码
6. 因子分析的主要作用:( A )
A、对变量进行降维
B、对变量进行判别
C、对变量进行聚类
D、以上都不对
7. 关于K-means 聚类过程正确的是:( A )
A、使用的是迭代的方法
B、均适用于对变量和个案的聚类
C、对变量进行聚类
D、以上都不对
8. 东北人养了一只鸡和一头猪。一天鸡问猪:"主人呢?"猪说:"出去买蘑菇了。"鸡听了撒丫子就跑。猪说:"你跑什么?"鸡叫道:“有本事主人买粉条的时候你小子别跑!"以上对话体现了数据分析方法中的( A )
A. 关联
B. 聚类
C. 分类
D. 自然语言处理
9. 已知甲班学生“统计学”的平均成绩为86分,标准差是12.8分,乙班学生“统计学”的平均成绩是90分,标准差是10.3分,下列表述正确的是( A )
A. 乙班平均成绩的代表性高于甲班
B. 甲班平均成绩的代表性高于乙班
C. 甲、乙两班平均成绩的代表性相同
D. 甲、乙两班平均成绩的代表性无法比较
10. 根据样本资料估计得出人均消费支出Y对人均收入X的回归模型,表明人均收入每增加1%,人均消费支出将增加( B )
A. 0.2%
B. 0.75%
C. 2%
D. 7.5%
11. 某企业根据对顾客随机抽样的信息得到对该企业产品表示满意的顾客比率的95%置信度的置信区间是(56%,64%)。下列正确的表述是( A )
A. 总体比率的95%置信度的置信区间为(56%,64%)
B. 总体真实比率有95%的可能落在(56%,64%)中
C. 区间(56%,64%)有95%的概率包含了总体真实比率
D. 由100次抽样构造的100个置信区间中,约有95个覆盖了总体真实比率
12. 以下哪个语句可以将字符型数值date(示例:“2001-02-19”)转换为数值类型? ( A )
A、INPUT(date,YYMMDD10.)
B、PUT(date,YYMMDD10)
C、INPUT(date,YYMMDD10.)
D、PUT(date,YYMMDD10)
13. ,取值范围在[0,1],反映回归曲线的拟合优度,当趋近于0,则回归曲线拟合优度( B )
A.越好
B. 越差
C. 适中
D. 以上都不对
14. 分析购买不同产品的频次时,使用以下哪个任务? ( D )
A、列表数据
B、汇总表
C、汇总统计量
D、单因子频数
15. 当你用跑步时间(RunTime)、年龄(Age)、跑步时脉搏(Run_Pulse)以及最高脉搏(Maximum_Pulse)作为预测变量来对耗氧量(Oxygen_Consumption )进行回归时,年龄(Age)的参数估计是-2.78. 这意味着什么?( B )
A、年龄每增加一岁,耗氧量就增大2.78.
B、年龄每增加一岁,耗氧量就降低2.78.
C、年龄每增加2.78岁,耗氧量就翻倍。
D、年龄每减少2.78岁,耗氧量就翻倍。
16. ROC曲线凸向哪个角,代表模型约理想?( A )
A、左上角
B、左下角
C、右上角
D、右下角
17. 在所有两位数(10-99)中任取一两位数,则此数能被2或3整除的概率为 ( B )
A. 6/5
B. 2/3
C. 83/100
D.均不对
18. 对事件A和B,下列正确的命题是 ( D )
A.如A,B互斥,则,也互斥
B. 如A,B相容,则, 也相容
C. 如A,B互斥,且P(A)>0,P(B)>0,则A.B独立
D. 如A,B独立,则,也独立
19. 掷二枚骰子,事件A为出现的点数之和等于3的概率为 ( B )
A.1/11
B. 1/18
C. 1/6
D. 都不对
20. A和B两事件,若 P(AUB)=0.8,P(A)=0.2,P()=0.4 则下列 ( B )成立。
A. P()=0.32
B. P()=0.2
C. P(AB)=0.4
D. P()=0.48
21. 随机地掷一骰子两次,则两次出现的点数之和等于8的概率为 ( C )
A. 3/36
B. 4/36
C. 5/36
D. 2/36
22. 抽样推断中,可计算和控制的误差是 ( D )
A.登记误差
B.系统性误差(偏差)
C.抽样实际误差
D.抽样平均误差
23. 假设检验中显著性水平是 ( B )
A.推断时犯取伪错误的概率
B.推断时犯取伪弃真的概率
C.正确推断的概率
D.推断时视情况而定
24. 抽样调查中,无法消除的误差是 ( A )
A.随机误差
B.工作误差
C.登记误差
D.偏差
25. 当时,两个相关变量 ( C )
A.低度相关
B.中度相关
C.高度相关
D.不相关
26. 描述一组对称(或正态)分布资料的离散趋势时,最适宜选择的指标是(B)
A.极差
B.标准差
C.均数
D.变异系数
27. 以下指标中那一项可用来描述计量资料离散程度(D)
A.算术均数
B.几何均数
C.中位数
D.极差
28. 偏态分布资料宜用下面那一项描述其分布的集中趋势(C)
A.算术均数
B.标准差
C.中位数
D.四分位数间距
29. 下面那一项可用于比较身高和体重的变异度(C)
A.方差
B.标准差
C.变异系数
D.全距
30. 正态曲线下,横轴上从均数到+∞的面积为(C)
A.97.5%
B.95%
C.50%
D.5%
31. 横轴上,标准正态曲线下从0到1.96的面积为: (D)
A.95%
B.45%
C.97.5%
D.47.5%
32. 下面那一项分布的资料,均数等于中位数。(D)
A.对数正态
B.左偏态
C.右偏态
D.正态
33. K-均值类别侦测要求输入的数据类型必须是( B )。
A整型
B数值型
C字符型
D逻辑型
34. 某一特定的X水平上,总体Y分布的离散度越大,即σ2越大,则( A )。
A.预测区间越宽,精度越低
B.预测区间越宽,预测误差越小
C 预测区间越窄,精度越高
D.预测区间越窄,预测误差越大
35. 如果X和Y在统计上独立,则相关系数等于( C )。
A.1
B.-1
C.0
D.∞
36. 根据决定系数R2与F统计量的关系可知,当R2=1时,有( D )。
A.F=1
B.F=-1
C.F=0
D.F=∞
37. 假设两变量线性相关,两变量是等距或等比的数据,但不呈正态分布,计算它们的相关系数时应选用( B )。
A. 积差相关
B.斯皮尔曼等级相关
C.二列相关
D.点二列相关
38. 回归模型中,关于检验所用的统计量,下列说法正确的是( D )。
A.服从
B.服从
C.服从
D.服从
39. 下面有关HAVING子句描述错误的是(B)。
A:HAVING子句必须与GROUP BY 子句同时使用,不能单独使用
B:使用HAVING子句的同时不能使用WHERE子句
C:使用HAVING子句的同时可以使用WHERE子句
D:使用HAVING子句的作用是限定分组的条件
40. 是( C )分布的密度函数。
A.指数
B. 二项
C. 均匀
D. 泊松
41. 根据判定系数R2与F统计量的关系可知,当R2=1时有( C )。
A.F=1
B.F=-1
C.F=∞
D.F=0
42. 在SQL查询时,使用WHERE子句指出的是(C)。
A:查询目标
B:查询结果
C:查询条件
D:查询视图
43. SQL查询语句中HAVING子句的作用是(C)。
A:指出分组查询的范围
B:指出分组查询的值
C:指出分组查询的条件
D:指出分组查询的字段
44. SQL的数据操作语句不包括(D)。
A:INSERT
B:UPDATE
C:DELETE
D:CHANGE
45. SQL语句中查询条件短语的关键字是(A)。
A:WHERE
B:FOR
C:WHILE
D:CONDITION
46. SQL语句中修改表结构的命令是(C)。
A:MODIFY TABLE
B:MODIFY STRUCTURE
C:ALTER TABLE
D:ALTER STRUCTURE
47. SQL语句中删除表的命令是(A)。
A:DROP TABLE
B:DELETE TABLE
C:ERASE TABLE
D:DELETE DBF
48. 相关有以下几种(ABC)。
A.正相关
B.负相关
C.零相关
D.常相关
49. 相关系数的取值可以是(ABC)。
A. 0
B.-1
C. 1
D. 2
50. 某种产品的生产总费用2003年为50万元,比2002年多2万元,而单位产品成本2003年比2002年降低5%,则( ACDE )
A、生产费用总指数为104.17%
B、生产费用指数为108.56%
C、单位成本指数为95%
D、产量指数为109.65%
E、由于成本降低而节约的生产费用为2.63万元
51. 三个地区同一种商品的价格报告期为基期的108%,这个指数是( BE )
A、个体指数
B、总指数
C、综合指数
D、平均数指数
E、质量指标指数
52. 有关数据库的说法正确的是(ABCD)
A.元数据是描述数据的数据
B.使用索引可以快速访问数据库中的数据,所以可以在数据库中尽量多的建立索引
C.数据库中一行叫做记录
D.数据库中的每一个项目叫做字段
53. 统计数据按来源分类,可以分为(BD)
A.类别数据
B.二手数据
C.序列数据
D.一手数据
E.数值数据
54. 以下哪些变量代表RFM方法中的M:( AB )
A.最近3期境外消费金额
B.最近6期网银平均消费金额
C.信用卡的消费额度
D.距最近一次逾期的月数
55. 在作逻辑回归时,如果区域这个变量,当Region=A时Y取值均为1,无法确定是否出现的是哪个问题?(ABD)
A. 共线性
B. 异常值
C. 拟完全分离(Quasi-complete separation)
D. 缺失值
56. 下列Z值( BCD )可以被认为是异常值。
A、0
B、-3
C、6
D、10
57. 下列问题( ABC )使用参数检验分析方法。
A、评估灯泡使用寿命
B、检验食品某种成分的含量
C、全国小学一年级学生一学期的平均课外作业时间
D、全国省市小康指数高低
58. 两独立样本t检验的前提( ABC )
A、样本来自的总体服从或近似服从正态分布
B、两样本相互独立
C、两样本的数量可以不相等
D、两样本的数量相等
59. 两配对样本t检验的前提( ABD )
A、样本来自的总体服从或近似服从正态分布
B、两样本观察值的先后顺序一一对应
C、两样本的数量可以不相等
D、两样本的数量相等
60. 下面给出的t检验的结果,( CD )表明接受原假设,显著性水平为0.05。
A、0.000
B、0.039
C、0.092
D、0.124
61. 方差分析的基本假设前提包括( AC )
A、各总体服从正态分布
B、各总体相互独立
C、各总体的方差应相同
D、各总体的方差不同
62. 下列( ABC )属于多选项问题。
A、购买保险原因调查
B、高考志愿调查
C、储蓄原因调查
D、各省市现代化指数分析
63. 层次聚类的聚类方式分为两种,分别是( AB )
A、凝聚方式聚类
B、分解方式聚类
C、Q型聚类
D、R型聚类
以下是针对机器学习、深度学习及自然语言处理领域的常见面试题解析,采用CSDN博客常用的Markdown语法规范,编号从1开始:
核心思想:基于贝叶斯定理与特征条件独立假设的分类算法,适用于高维稀疏数据(如文本分类)。
针对类别不平衡问题,通过增加少数类样本数量改善模型对少数类的识别能力:
梯度消失(反向传播中梯度趋近于0)
梯度爆炸(梯度过大导致参数更新不稳定)
卷积层(Convolutional Layer) 的核心是通过局部连接和权重共享提取特征:
池化层(Pooling Layer):
经典CNN架构
目标检测算法
前沿进展
核心技术架构(基于GPT-3.5/4):
核心优势:通过“预训练+人类反馈”模式,在对话理解、逻辑推理、多轮交互等方面接近人类水平,推动通用AI助手落地。
以上内容涵盖机器学习核心算法原理、工程优化方法及前沿技术,适合数据开发与数据分析岗位面试准备。建议结合具体业务场景(如推荐系统、图像识别、NLP)深入理解算法适用条件与优缺点。
MapReduce工作流程
问题:简述MapReduce的核心流程,重点说明Shuffle阶段。
答案:
Map阶段:
Shuffle阶段:
Reduce阶段:
Hive优化与数据倾斜
问题:Hive为什么会出现数据倾斜?如何优化?
答案:
map.aggr=true
,在Map阶段先局部聚合,减少Shuffle数据量。set mapreduce.job.reduces=N
手动设置合理分区数。repartition
调整并行度,适应资源变化。user_login
表中查询每天最早登录的3个用户信息(字段:user_id, login_time, date)。SELECT user_id, login_time, date
FROM (
SELECT
user_id,
login_time,
date,
ROW_NUMBER() OVER (PARTITION BY date ORDER BY login_time) AS rn
FROM user_login
) AS subquery
WHERE rn <= 3;
解析:使用窗口函数ROW_NUMBER
按日期分区,按登录时间排序,取排名≤3的记录。
user_login
(user_id, login_date),找出连续登录≥3天的用户。WITH ranked_dates AS (
SELECT
user_id,
login_date,
DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) DAY) AS group_date
FROM user_login
),
counted_dates AS (
SELECT
user_id,
group_date,
COUNT(login_date) AS consecutive_days
FROM ranked_dates
GROUP BY user_id, group_date
)
SELECT user_id
FROM counted_dates
WHERE consecutive_days >= 3;
解析:通过DATE_SUB
将连续日期转换为相同分组标识(group_date),同组内日期连续,统计每组天数即可。
数据倾斜处理(通用方案)
问题:数据倾斜的常见解决方法有哪些?
答案:
预处理均衡数据:在数据源层(如Kafka生产者)按Key均匀分布分区。
增加并行度:调整Spark/Flink的分区数,避免单个Task处理过多数据。
随机前缀聚合:对倾斜Key添加随机前缀(如user_id
→user_id_随机数
),先局部聚合再全局聚合。
过滤异常值:对占比极低的Key(如日志中的无效ID)单独处理,或直接过滤。
使用Map端聚合:在Hive/Spark中开启Map侧预聚合,减少Shuffle数据量。
大整数去重(Bitmap算法)
问题:在10亿个整数中找出不重复的整数,如何优化内存占用?
答案:
00
(未出现)、01
(出现1次)、10
(出现多次)、11
(保留)。2^32 * 2bit = 1GB
内存,扫描数据更新Bitmap,最终筛选状态为01
的数。