自我介绍
答:为什么选择做数据开发,比较合适,做事细心、认真。有些完美主义,其实这不是一件好事,然后喜欢做一件事情就能有一定的反馈成果,为什么不想要读博,一篇论文需要打磨很久才能到我想要的目的,那我在这个打磨得过程中,我看不到任何成果得反馈,我会着急。
对数据结构有没有了解
答:基本了解,本科学习过数据结构的课程。
答:(1) 链表是链式存储结构,数组是顺序存储结构;
(2)链表通过指针连接元素与元素,在内存中不连续,而数组则是把所有元素按照顺序进行存储;
(3)链表的插入和删除元素容易,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难,而数组寻找某个元素较为简单,但插入与删除比较复杂,因为数组的最大长度在编程一开始就确定了,因此当达到最大长度时,扩充长度不如链表方便。
两者相同之处:都可以实现数据的顺序存储,构造的模型呈线性结构。
java ListNode pre = null; ListNode cur = head; while(cur!=null&&cur.next!=null){ ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; }
ListNode cur = head;
while(cur!=null&&cur.next!=null){
ListNode next = cur.next.next;
cur.next.next = cur;
cur=head.next;
head.next=next;
}
(3)递归
说明:让当前结点的下一个结点的next指针指向当前节点
让当前结点的next指针指向null,实现从尾部开始的局部反转
当递归函数全部出栈后,链表反转完成
if(head==null ||head.next==null){
return head;
}
ListNode re = reverseList(head.next);
head.next.next = head;
head.next = null;
return re;
}
答:运用两个双指针,快慢指针,快指针每次走两步,慢指针每次走一步,最终两个指针会相遇(在不是null的地方)
答:相遇的点就是环形链表的入口
答:基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL(HQL)查询功能。
数据仓库:存数据的地方,存的数据更大,仓库里面放的数据内容都是分门别类的,
hive能解决的问题,mapreduce一定能解决,反之不成立
(1)hive处理的数据存储在HDFS
(2)hive分析数据底层的实现是mapreduce
(3)执行程序运行在yarn上
可以看做是hadoop的客户端,一个入口,提交的是hql代码,实现的mapreduce操作
答: 数据仓库通过SQL进行统计分析,将SQL语言中常用的操作(select,where,group等)用MapReduce写成很多模板,所有的mapreduce模板封装在hive中;然后客户端根据用户需求编写相应的sql语句,到封装到hive中的mapreduce模板中找到所需要的,然后通过hive框架匹配出相应的mapreduce模板,运行mapreduce程序,生成相应的分析结果。最后将结果返回给客户端。
hive中写了一套逻辑,将sql转换成mr,hive相当于是hadoop的一个客户端,通过提交sql让hive解析,封装成mapreduce任务去hdfs读取数据,提交给yarn执行
针对sql语言如何写mapreduce模板
select deptid,count(*) from emp group by deptid
mapreduce的流程:inputformat读取数据,给map,map给reduce,reduce再给outputformat,key是deptid,value的值是count
首先,根据from字段决定inputformat读什么数据,from是表的名字,而inputformat是读取的文件夹
hive的元数据记录着表名和hdfs的对应关系
答案:
(1)order by是全局排序,只有一个reducer,改reducer个数也没有意义。number of reducers = 1。
(2)sort by是区内排序(每个recude内部),达不到全局排序的效果。可以自己定义reduce个数。分区没有规律(随机的,害怕数据倾斜),可以自定义
(3)distribute by是用来做分区的,和sort by连用的。往往是先distribute by(比如根据部门分区,然后在部门内部的薪水进行排序),为了给sort by使用的。
(4)cluster by,当distribute by与sort by字段一样,可以用cluster by代替,除了具有distribute by的功能外还兼具sort by的功能,但是排序只能是升序排序,不能指定排序规则为ASC或者DESC
user_id | log_in_date |
---|---|
u_01 | 2020-01-02 |
u_01 | 2020-01-04 |
u0001 | 2019-10-10 |
u0001 | 2019-10-11 |
u0001 | 2019-10-12 |
u0001 | 2019-10-13 |
u0001 | 2019-10-14 |
// 按时间降序排序
select
user_id,
log_in_date,
(row_number() over(partition by user_id order by log_in_date desc)) as 'rank'
from
user_log
--按时间升序排列
select
user_id,
log_in_date,
(row_number() over(partition by user_id order by log_in_date asc)) as 'rank'
from
user_log
//row_number()进行排序,分区排序
//用登录时间相减(相加)排序好的序列号
select
user_id,
DATE_ADD(log_in_date, INTERVAL row_number() over(partition by user_id order by log_in_date DESC ) day) AS 'add_time'
FROM user_log
//连续登录天数
SELECT user_id, add_time,count(add_time) AS '连续登录天数'
FROM
(
select
user_id,
DATE_ADD(log_in_date, INTERVAL row_number() over(partition by user_id order by log_in_date DESC ) day) AS 'add_time'
FROM user_log
)T
GROUP BY user_id, add_time
--最大连续登录天数
SELECT user_id,MAX(连续登录天数)
FROM
(
SELECT user_id, add_time,count(add_time) AS '连续登录天数'
FROM
(
select
user_id,
DATE_ADD(log_in_date, INTERVAL row_number() over(partition by user_id order by log_in_date DESC ) day) AS 'add_time'
FROM user_log
)T
GROUP BY user_id, add_time
)M
//连续登录天数为2的用户
SELECT user_id
FROM
(
SELECT user_id, add_time,count(add_time) AS '连续登录天数'
FROM
(
select
user_id,
DATE_ADD(log_in_date, INTERVAL row_number() over(partition by user_id order by log_in_date DESC ) day) AS 'add_time'
FROM user_log
)T
GROUP BY user_id, add_time
)M
where M.连续登录天数 = 2
//连续登录天数为2的用户法2
SELECT user_id
FROM
(
SELECT user_id,COUNT(sub_date) AS '连续登录次数'
FROM
(
SELECT
user_id,
log_in_date,
DATE_SUB(log_in_date,INTERVAL row_number () over (PARTITION BY user_id ORDER BY log_in_date ASC) DAY) AS 'sub_date'
FROM
user_log
)t
GROUP BY user_id,
sub_date
)m
WHERE 连续登录次数 = 2
1.对哪些大数据组件比较熟悉?(hive hadoop)
2.hadoop介绍一下
3.hdfs读写流程
4.mapreduce运行原理
5.hive的原理
6.hive里面的数据是怎么存储的,存储结构
7.行存储和列存储的好处
8.hadoop、hive的数据倾斜问题
9.n个有序数组,如何把他们排到一起
10.B+树和B-树的区别
多路查找树:
11.B+树移动会产生什么问题
12.hive中建模有哪些形式?实际场景如何去选择用哪种建模方式?
13.数据仓库的分层
数据运营层存放的是接入的原始数据,数据仓库层存放的是我们要重点设计的数据仓库中间层数据,数据应用层是面向业务定制的应用数据
14.dwd层到dws层做了什么事情
(1)传统行式数据库的特性:
(2)列式数据库
(3)
根本原因 :数据经过map后,由于不同key的数据量分布不均,在shuffle阶段通过partition将相同的key的数据打上发往同一个reducer的标记,然后开始spill写入磁盘,最后merge成最终map阶段输出文件。因此数据量很大的key将发往同一个reducer,超出了节点的计算能力,等待时间超出了可接收范围
表现 :
1.导致倾斜的原因
具体原因
2.业务逻辑造成倾斜的原因
3.数据分布常见的数据倾斜
思路:
具体实现:
方法一: reduce端的隐患在map端解决
方法二: 对key操作,减缓reduce的压力
首先,倾斜原因
方法三: 参数调整
针对join产生的数据倾斜
a. 大表和小表
b.大表和大表的join产生的数据倾斜
重载:发生在本类或者其子类中,具有相同的方法名。参数列表不同,返回值类型可以相同也可以不同方法名相同,参数列表必须不一样,返回值类型可相同可不同 ,总结,重载就是针对不同情况写不同的方法,例如同一个类中的不同构造方法
重写:发生在父类和子类之间,方法名相同,参数相同,返回值类型相同,访问权限不能比父类中被重写的方法的访问权限低,比如父类是public,那么子类中该方法不能是protected,子类和父类在同一个包中,子类可以重写父类所有方法,除了声明为final和private,总结,具体的实现类对于父类的方法不满意,需要写一个满足自己要求的方法。
事务: 一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求。事务是一个不可分割的工作逻辑单元。
select goods_price,goods_name from sw_goods where goods_price > 100
select goods_price,goods_name from sw_goods having goods_price > 100
select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category having ag > 1000
select goods_category_id , avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category //报错!!因为from sw_goods 这张数据表里面没有ag这个字段
建模技术分为关系建模和维度建模
关系建模
维度建模
hive.map.aggr = true
;(2)在map端进行聚合操作的条目数目hive.groupby.mapaggr.checkinterval = 100000
;(3)有数据倾斜的时候进行负载均衡(默认是false)hive.groupby.skewindata = true
。设置为true时,会开启两个mr job,第一个job中,map的输出结果随机分布到reduce中,每个reduce做部分聚合操作,并输出结果,这样处理的结果是相同的key可能被分发到不同的reduce中,从而达到负载均衡的目的;第二个mr job根据预处理的结果按照group by key分布到reduce中,这个过程保证相同的key被分布到同一个reduce中,完成最终的聚合操作。set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
在map结束后合并小文件SET hive.merge.mapfiles=true;
在整个任务结束后合并小文件SET hive.merge.mapredfiles=true;
链接: link.
链接: link.
哈希索引只存储了对应的哈希值和指向每个数据行的指针,因此索引的结构紧凑,让哈希索引查找的速度非常快
二叉树
二叉搜索树(二叉查找树)
平衡二叉树
相同点
不同点
b树(平衡多路查找树)
b+树
区别
链接: link.
left join
inner join
每个步骤都会产生一个虚拟表,该虚拟表作为下一个步骤的输入
1from阶段:指明查询的来源表
2 where阶段:对生成的VT1中的行进行筛选生成VT2,此时数据还没有分组,所以不能在where中出现对统计的过滤
3 group by阶段:按照指定的列名列表,将VT2中的行分组,生成VT3,最后每个分组只有一行,会将null值分到同一个分组中
4 having阶段:对VT3的分组筛选,生成VT4,count(列名)不包括null,count(1)和count(*)包括null值在内的所有数量
5.select阶段:首先计算select中的表达式,生成VT5-1,如果有distinct,则删除VT5-1中的重复行
6 order by阶段:对VT5中的行进行排序生成VT6
7 limit阶段:取出指定行的记录,产生虚拟表VT7返回给用户
冒泡排序
public static void BubbleSort(int [] arr){
int tmp;
for(int i = 0;i<arr.length;i++){
for(int j =0;j<arr.length-i-1;j++){
if(arr[j+1]<arr[j]){
tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
}
}
}
}
插入排序
private static void insertSort(int []arr){
int n = arr.length;
for(int i = 1;i<n;i++){
int j = i;
int target = arr[i];
while(j>0 && target<arr[j-1]){
arr[j] = arr[j-1];
j--;
}
arr[j] = target;
}
}
快速排序
private static void quickSort(int[] arr,int leftIndex,int rightIndex){
if(leftIndex >= rightIndex){
return;
}
int left = leftIndex;
int right = rightIndex;
int key = arr[leftIndex];
while(left<right){
while(right>left && arr[right]>=key){
right--;
}
arr[left]=arr[right];
while(left<right && arr[left]<=key){
left++;
}
arr[right]=arr[left];
}
arr[left]=key;
quickSort(arr,leftIndex,left-1);
quickSort(arr,right+1;rightIndex);
}
归并排序
private static void mergeSort(int[]arr,int left,int right){
if(left>=right){
return;
}
int mid = (left+right)/2;
mergeSort(arr,left,mid);
mergeSort(arr,mid+1,right);
merge(arr,left,mid,right)
}
private static void merge(int[]arr,int left,int mid,int right){
int [] tmp = new int[arr.length];
int tIndex = left;
int cIndex = left;
int r1 = mid+1;
while(left<=mid && r1<=right){
if(arr[left]<=arr[r1]){
tmp[tIndex] = arr[left];
left++;
tIndex++:
}else{
tmp[tIndex]=arr[r1];
r1++;
tIndex++;
}
}
while(left<=mid){
tmp[tIndex]=arr[left];
left++;
tIndex++:
}
while(r1<=right){
tmp[tIndex]=arr[r1];
r1++;
tIndex++;
}
while(cIndex<=right){
arr[cIndex]=tmp[cIndex];
cIndex++;
}
}
堆排序