2021大数据面试题

文章目录

前言

近期负责了公司大数据开发岗的技术面,总结了几个面试的问题。后续有面试会继续总结。

一、考察SQL能力

初级

1. 表A只有一个字段ID,值为[1,2,2,3,3,3]。现要求查询出重复的id

select ID from A group by ID having count(1) >1;

2.表A又两个字段ID和Create_Time,计算今天新增的ID表[不包含昨天的那一部分];

select t1.a from (select id from a where time = today)T1 left join (select id from a where time = yesterday)T2 on T1.id = t2.id where t2.id is null;

3. 表A和表B都只有一个字段Account,如果account来自A则输出red,来自B则输出blue;

select case when tba.虚拟=’A’ then ‘red’ when tba.虚拟=’B’ then ‘blue’ end as A_B from (select ‘A’ 虚拟,account from table_a union select ‘B’ 虚拟,account from table_b )TBA;

4. 计算字符串’ABCABC’ 中字符A的个数

select length('ABCABC') - nvl(length(replace('ABCABC','A','')),0) from dual;

高级

5. 表A有两个字段ID和TIME,比较一下两个sql的区别[开放问题]

select * from A;  select ID,TIME from A;

前一句会先扫描列;
生产不建议前一句,会枚举出所有列;
后一句列顺序固定;
当修改列名的时候,后一句查询会报错;

6.为了避免in / not in导致效率低下可以使用哪些方式?

(in/not in 会导致数据库引擎放弃索引进行全表扫描)
避免使用in/not in, 用exist替换

SELECT * FROM t1 WHERE username IN (SELECT username FROM t2);
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username);

7. 为了避免Or导致效率低下,可以使用哪些方式?

(or 会导致数据库引擎放弃索引进行全表扫描)
避免使用or,用union替换

SELECT * FROM t WHERE id = 1 OR number = 1
SELECT * FROM t WHERE id = 1 union SELECT * FROM t WHERE number = 1

8. 模糊查询%放在左边会发生什么?

关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%

二、考察Shell能力

1. 简述shell文本替换

  • 在vi编辑模式下:%s/old/new/g
  • 在shell模式下用sed

2. 简述文本查找和文件查找

  • 文本查找grep -l -r '文本' *
  • 文件查找find ./ -name '文件名'

三、考察大数据开发相关技能

1. 优化sqoop采集稳定性

导出数据的时候可能会失败用—staging-table –clear-staging先将数据导到临时表中,然后将临时表的数据复制到目标表中失败就-clear-staging重新导

2. Maxwell/Canal相关设置

需要Mysql开启binlog;binlog的格式有三种:STATEMENT语句, ROW行, MIXED优化语句[一般是设置row类型]
需要注意的是Maxwell导出的格式是json

3. Kafka ack参数设置

1,producer等待partition的leader落盘成功就返回ack,增加offset继续生产。这样相比设置成-1(如果面金融类,这里可以说建议将ack设置成-1,然后在hive中处理数据重复的问题(根据id分组,开窗,取一个值))更加高效,比设置成0更加安全一点

4. HIVE

order by与sort by的区别

order by 全局排序 sort by分组排序,因此当只有一个map的时候 order by 与sort by效果一样

以下两句有什么区别?

oracle: create table a as select * from B; --copy表并加载数据
hive: create table if not exists A like B; --copy表结构
hive:create table if not exists A as select * from B

HIVE中的表A状态为Lock,怎么定位和处理这个问题[考察思路]

hive数据存储在HDFS;元数据存储在derty/mysql
a.在mysql中暴力删除元数据,再重建
b.在mysql中unlock表;分区表需要逐个分区unlock

5. Azkaban相关问题

azkaban的组成

[web/executor]

添加用户

[azkaban-users.xml]

azkaban失败重试

retries=1 #失败job的自动重试次数
retry.backoff=10000 #重试的间隔(毫秒)

6. Spark

Spark Streaming背压机制

参数控制:spark.streaming.backpressure.enabled[默认是false关闭的]

Spark Streaming优雅关闭

参数控制:spark.streaming.stopGracefullyOnShutdown

SparkSQL rdd、DS、DF转化[见图]

在这里插入图片描述

Spark RDD持久化的方法

SparkRDD是基于内存的,那么持久化RDD的方法有哪些?
1.persist()或者cache(),可以给persist()来传递存储级别. cache()方法是使用默认存储级别(StorageLevel.MEMORY_ONLY)的简写方法。

// rdd2.cache() // 等价于 rdd2.persist(StorageLevel.MEMORY_ONLY)
将基于内存的RDD使用cache()方法持久化到内存是有意义的,RDD不用重新计算

2.checkpoint()设置检查点

7.tidb

tidb的数据分片是怎样的?

TiKV 自动将底层数据按照 Key 的 Range 进行分片。每个 Region 是一个 Key 的范围,从 StartKey 到 EndKey 的左闭右开区间。Region 中的 Key-Value 总量超过一定值,就会自动分裂。

tidb的负载均衡是怎样完成的?

Placement Driver (PD) 会根据整个 TiKV 集群的状态,对集群的负载进行调度。调度是以 Region 为单位,以 PD 配置的策略为调度逻辑,自动完成

8.Doris

Doris的一些常用操作
drop
使用 Drop 操作直接删除数据库或表后,可以通过 Recover 命令恢复数据库或表(限定时间内),但临时分区不会被恢复。
使用 Alter 命令删除正式分区后,可以通过 Recover 命令恢复分区(限定时间内)。操作正式分区和临时分区无关。
使用 Alter 命令删除临时分区后,无法通过 Recover 命令恢复临时分区。
truncate
使用 Truncate 命令清空表,表的临时分区会被删除,且不可恢复。
使用 Truncate 命令清空正式分区时,不影响临时分区。
不可使用 Truncate 命令清空临时分区。
alter
当表存在临时分区时,无法使用 Alter 命令对表进行 Schema Change、Rollup 等变更操作。
当表在进行变更操作时,无法对表添加临时分区。

9.ClickHouse

创建一个带有一个枚举 Enum8类型的列。x 列存储类型定义以外列出的值会出现什么?

会抛异常:
Exception on client:Code: 49. DB::Exception: Unknown element ‘a’ for type Enum8

mergeTree和replacing Merge Tree有什么区别?

replacing Merge Tree是MergeTree 的基础上,添加了“处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现

MergeTree和summing Merge tree有什么区别?

MergeTree。区别在于,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值

10. Druid

Segmentss过大影响查询性能如何处理?

Segment的建议大小在300-700MB之间,我们目前是一个小时聚合一次,每小时的原始数据大概在50G左右,生成的Segments数据在10G左右,Segments过大影响查询性能
a.减小SegmentGranularity,按小时粒度聚合,可以考虑减少到分钟级别,比如20分钟。
b.在TunningConfig中增加partitionsSpec,官方解释如下:
在这里插入图片描述

  • 14
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值