oracle----------------------------------
数据类型:
数字:
integer 整数
number 任何数字,整数和小数
number(长度,精度)
字符串:
char(长度) 2000
varchar2(长度) 4000
时间:
date
大文件:4GB
blob 二进制文件 图片视频,过时的文件类型
clob 大文本格式
DCL:
grant 权限 to 用户;
revoke 权限 from 用户;
DDL:
create user 用户名 identified by 密码;
create table 表名(列名 数据类型 约束条件);
create view 视图名 as select语句;
create materialized view 物化视图名 refresh on commit | on demand start with sysdate next 下一个启动的时间 as select语句;
create index 索引 on 表名(列名);
create sequence 序列号名 start with 开始 increment by 自增数 maxvalue xx minvalue yy cycle cache;
alter:
alter user 用户名 identified by 新密码;
alter user 用户名 account unlock;
alter table 表名 rename to 新表名;
alter table 表名 add 列名 数据类型 约束条件;
alter table 表名 modify 列名 数据类型 约束条件;
alter table 表名 drop column 列名;
alter table 表名 rename column 旧列名 to 新列名;
alter table 表名 add constraint 约束名 约束类型(列名); alter table emp add constraint pk_empno primary key(empno);
alter table 表名 drop constraint 约束名;
drop:
drop 对象类型 对象名字;
drop table 表名;
drop user 用户名;
drop view 视图名;
truncate:
truncate table 表名;
DML:
insert into 表名(列名) values(值);
insert into 表名(列名) select 语句;
update 表名 set 列名=新值 where 筛选条件;
delete from 表名 where 筛选条件;
DQL:
select 列名 5
from 表名 1
where 筛选条件 2
group by 分组 3
having 聚合筛选 4
order by 排序; 6
子查询,句子的嵌套的查询
联合查询:select * from a [inner|left|right|full] join b on a.xx=b.yy;
select * from a,b where a.xx=b.yy;
select * from a,b where a.xx=b.yy(+);
select * from a,b where a.xx(+)=b.yy;
select * from a,b where a.xx=b.yy(+) union select * from a,b where a.xx(+)=b.yy;
内连接:
左连接:
a 1 2 3
b 2 3 4
select * from a left join b on a.id=b.id and a.id=2;
1 null
2 2
3 null
select * from a left join b on a.id=b.id where a.id=2;
2 2
右连接:
全连接:
2 2
3 3
1 null
null 4
集合运算:union all和union的区别?
union all
union
minus
intersect
函数:
聚合 max min avg sum count
单行:
数字 abs round trunc ceil floor pow mod
字符串 substr concat length upper lower initcap replace
日期 last_day add_months months_between
转换 to_char to_number to_date
空值替换 nvl nvl2
逻辑处理 decode sign
行列转换 pivot
select * from (select deptno,sal from emp)
pivot(avg(sal) for deptno in(10,20,30));
select avg(case when deptno=10 then sal else null end) d10,
avg(case when deptno=20 then sal else null end) d20,
avg(case when deptno=30 then sal else null end) d30
from emp;
分析函数:xxx() over(partition by 分组 order by 排序 asc|desc)
排名:row_number rank dense_rank
平移:lag lead
视图:
create view 视图名 as select语句 with read only;
视图的优点:1.sql语句的简化 2.节省网络流量 3.简化业务逻辑 4.安全性较好
视图里面不应该写太复杂的语句
物化视图:
on commit:如果对应的数据源表发生了变更并且进行了commit提交,物化视图也一起更新
on demand:进行定时更新的操作
更新有两种方法:complete 全量更新 fast 增量更新 force 默认的更新(就是fast)
物化视图和视图的区别?
1.视图是虚拟的,物化视图是实际的表
2.视图是实时更新,物化视图有两种更新方式
3.物化视图还可以添加索引等信息
4.视图不会占用磁盘,物化视图会占用磁盘
物化视图也叫做快照表,一般用来保存过去某个时间点的表格数据,进行数据的备份。
索引:
类型: 位图 主键 唯一 普通 组合 函数 分区索引(全局 本地)
bitmap和btree两种索引的区别?
oracle的索引是通过什么来搜索数据的? rowid
不同的索引在不同的什么场景下使用?
分区表的全局和本地索引的区别是什么?
索引在什么时候会失效?
索引是不是越多越好?
怎么样快速的进行大表格的数据新增?
分区:
分区表的类型:列表 散列 范围 组合
不同的分区表分别在什么场景下使用?
分区表的创建语法:
create table 表名(
列名 数据类型
)partition by 分区类型(分区的列)
(
partition 子分区名字 分区规则
);
执行计划:
你有没有进行过数据库的优化? 有没有做过sql优化? 慢sql的优化?
优化的问题涉及到:执行计划、分区、索引、关键字的优化、优化器
通过执行计划查看句子是否需要优化,查看执行计划里面句子的运行逻辑、是否运行分区、是否使用索引、使用的是哪个索引、句子的运行顺序、表格的查询顺序、资源的消耗、硬盘读取、CPU等消耗、每个句子的执行时间等等。
优化器:
多线程 parrallel多线程
表连接的时候,有哪几种表连接的逻辑?
哈希连接
NL嵌套连接
merge join 排序归并
哪种逻辑哪种连接的方式,在什么时候是最快的?
哈希连接:等值查询的时候,并且连接的列没有索引的时候
NL:等值查询的时候,并且连接的列是有索引的时候;非等值的时候
merge:直接查询数值而不是查询列的数据
锁:
行锁和表锁
乐观锁和悲观锁
死锁的概念
出现死锁的时候怎么办 alter system kill session ‘’;
事务:
事务的特征是什么? 原子性 隔离性 一致性 持久性
存储过程:
存储过程的硬代码有哪些?
create or replace procedure 存储过程的名字(参数)
as
声明
begin
逻辑
end;
存储过程一般用来做什么?
使用存储过程实现一段固定的功能:数据的查询、计算、日志的记录、数据备份、全量和增量的抽取
在写存储过程的时候,遇到过什么问题?
第一种,语法没有问题,但是因为上游数据的问题,导致了sql语句运行出错或报异常,这个时候就需要去对存储过程的代码进行异常的捕获
第二种,运行的结果和预期结果不太一致:在存储过程中,在每个判断、循环等位置,写上变量和表格数据的打印,查看一下是否是逻辑问题,然后再查看表格对应的上游数据是否有问题
游标:
为什么要写游标?
需要对表格的数据一行行进行计算和判断的时候。
游标有哪些不同的类型?
显性(静态和动态)和隐形。
静态和动态的区别?
静态是在声明部分去定义游标的内容,动态是在执行部分去定义游标内容;
静态的内容一个游标只能定义一次,动态可以在执行过程中进行变更。
动态游标怎么写的?
type 数据类型名 is ref cursor;
游标名 数据类型名;
open 游标名 for select 语句;
fetch 游标名 into 变量;
close 游标名;
游标执行的过程是什么?
声明 cursor
打开 open
抓取 fetch
关闭 close
函数:
什么时候会自己去编写函数?
经常需要的一些固定的复杂的业务计算,就可以写成函数
触发器:
什么是触发器?
你什么时候会用触发器?
有哪些触发器?
包:
什么时候用到包?
上家公司写过多少存储过程?
写过最长的sql语句是多长?这个句子是解决了什么需求?
什么是维度什么是指标?
有没有建过维度表?
怎么去设计维度表的?
第一种:严格遵守第三范式去建维度表
第二种:根据业务需求的指标创建维度表
维度表和事实表的区别?
事实表大部分都在数仓里面,事实表一张表有很多的列,举个例子,一个事实表里面可能有销售员信息、门店信息、地区信息、销售信息、产品信息、库存信息等等,里面就会有大量的冗余信息;
维度表就是根据某个具体的维度,进行表格的细分,例如一个维度表只会存放销售员信息,一个表格的列只和表格的主键直接相关。
缓慢变化维和拉链表:
拉链表长什么样?
拉链表除了有表格核心的列的信息之外,还有数据变更状态的开始时间、结束时间、状态码,
例如现在有一个新的数据进来,这个数据的开始时间是现在时间,结束时间是2999-12-31的最大值,状态码给个1,如果这个数据的状态发生了变更,那么这个时候要新增一个数据,除了数据的新内容之外,开始时间是现在时间,结束时间是2999-12-31的最大值,状态码给个1,上一个这个数据的历史信息,结束时间要变成新数据的开始时间,状态码变成0。
什么是缓慢变化维?
记录拉链表前后数据变更的列,就是缓慢变化维。
有哪几种不同的缓慢变化维?
有两种,拉链表是最常见的一种。
还有一种只记录最近的变量数据和状态,不会记录所有的变更状态。
核心列 变更列 变更时间
id name addr mobile old_addr old_mobile update_time
1 li gz 131xx sz 130xxx 2020-12-18
python--------------------------------------------------
数据类型
数字 int float
字符串 str 有序
列表 list 有序
元组 tuple 有序 不可变
字典 dict 无序
集合 set 无序
布尔 bool
元组和列表的区别?
常用函数
str.upper() str.lower() str.title() str.replace() str.find() str.count()
str.index() str.split() str.startswith() str.endswith() str.format() str.join()
list.append() list.insert() list.pop() list.remove() list.sort() list.count()
dict.keys() dict.values() dict.pop() dict.clear()
print() input() type() len()
int() float() str() list() tuple() set()
str.find()和str.index()的区别?
常用模块
random xlrd xlwt json requests re cx_Oracle os…
json内容的解析 json.loads()
cx_Oracle的操作 先connect连接,再新建cursor游标,再使用游标execute某个sql语句,如果是查询就使用fetchall获取内容,如果是dml操作就是commit提交,最后关闭数据库。
自定义函数
def 函数名字(输入参数):
函数的内容
数字的累加、九九乘法表、文件的读取
linux---------------------------------------------
常用的linux命令?
文件的操作:touch cp mv vi/vim head tail more cat wc rm
sed grep
文件夹的操作:mkdir cp mv rm
软件的操作:yum ps netstat
硬件的操作:top df free
权限的操作:chmod
压缩包的操作:tar -z -c -x -t -f
查找的命令:find
定时任务的操作:crontab
服务的启动、停止和查看:service
会不会使用shell脚本?
hadoop----------------------------------------------------
hadoop里面熟悉的或者你知道的组件有哪些?
离线部分 hive yarn mr hdfs sqoop
实时部分 spark flume kafka hbase flink
mapreduce和spark的区别知道吗?
https://www.zhihu.com/question/53354580
hdfs里面的基本操作:
hadoop fs -put -get -appendToFile -mkdir -ls -rm -cat
mapreduce的基本原理:
分成map和reduce两个部分,首先是在map端对需要计算的数据进行拆分,分配到不同的计算资源上,分别进行计算,然后在reduce端对计算好的数据进行整合
hive和rdbms的数据库区别?
hive是使用mr计算,使用yarn调度资源,使用mysql存储元数据,使用hdfs存储数据,对小文件不友好,适合大文件一般都是PB TB级别的文件,没有主键和其他的约束,只有一个位图的索引
分区表有没有建过?
静态分区和动态分区的区别是什么?
静态分区的分区值是自己设置的,动态分区的分区值是通过select查询出来的某个列的值,动态分区需要打开动态分区的开关和打开nostrict非严格模式的开关,效率比静态分区要低。
静态可以通过load data和insert overwrite的方式添加数据,动态只能通过insert overwrite添加。
分桶表有没有建过?
分桶表在工作中用来做什么? 加快表连接的速度
分区和分桶的区别?
分区是partitioned by,创建的是文件夹,分桶是clustered by,创建的是文件,分区是新字段,分桶是已存在的字段,分区是自己设置规则,分桶是根据哈希算法分配的,分区是在查询分区字段的时候加快查询的速度,分桶是表连接的时候加快查询速度。
表格的存储格式有哪些,常用的是哪个?
textfile sequencefile rcfile orc
常用的是orc,orc有懒加载的模式,以行为单位进行数据压缩的,压缩率很高,查询到效率也很高
外部表有没有使用过?外部表的创建语法?
create external table 表名(
列名 数据类型)
各种分隔符的设置
location ‘hdfs文件夹位置’;
为什么要使用外部表,外部表和内部表的区别是什么?
外部表一般都是存放比较大的文件和表格,例如日志信息表,埋点数据的表格,大的业务数据表,内容表一般就是存储计算之后的结果,存储业务指标的计算结果
外部表如果删除的话,只会删除元数据,不会删除文件夹和内容,内部表会全部删除掉
文件的压缩格式常用的是哪种?
none record block
常用的是block压缩
数据倾斜有没有遇到过,经常在什么地方遇到?
大小表的连接;计算的表格有大量空值;不合理的sql语句
数据倾斜的表现?
看日志中reduce的百分比经常会卡在99%的位置不动了,sql语句长时间无法运行结束
如果发生了数据倾斜怎么去优化?怎么去预防?
如果是大小表连接,可以对大表进行数据的拆分,也可以使用分桶的方法来优化,或者使用mapjoin的优化器;
大量空值的话,会使用字符串加随机值的方式去填充空值;
查看是否有统计distinct结果之类的语句
说一下mapjoin优化器的原理?
将小表的数据先放入到内存中,然后使用大表去匹配内存中的小表数据。
kettle------------------------------------------------
kettle里面经常用到的组件、功能、模块有哪些?
抽取的功能经常用的有文本文档的读取、excel、csv、数据库表的读取、接口数据的读取、json数据等
转换的功能常用的有字符串的替换、字符串的操作、列的合并、列的拆分、排序、去重、空值替换、流程和数据的筛选、SQL脚本的组件
加载的功能常用的写入数据库表格、写入文档、插入更新等等
作业的部分就是对脚本进行调度,主要配置脚本运行的时间、脚本之间的依赖关系、脚本是否运行成功、发送邮件等
finereport---------------------------------------------
有没有使用过?有哪些基本的报表?使用了哪些功能?
普通报表、聚合报表、决策报表
设计表格模板、编辑可视化图表、添加模板参数、添加数据库连接、填写sql语句用来获取数据等等
=======================================================================
一个大数据的组:数据开发的人数 10
产品经理1 业务人员2 数据开发6 软件测试1
=======================================================================
面试
sql优化 ?
查看执行计划,分析哪个句子的部分消耗资源比较多,时间比较长;
查看表格是否有合理的分区;
查看表格是否有设置索引;
语句里面是否有索引失效的部分;
是否需要添加优化器…
数仓的架构?
SDM层里面主要是 做些什么?
DW有什么主题?
建表除了做些 除了三范式 还有其他范式的吗?
存储过程的优化?
还有hive怎么抽取 ? cx_Oracle pyhive mysqllib
sqoop kettle或者python(pyhive)
HIVE读取的过程?
一个表1个亿 ,一个表200万,数据倾斜怎么处理?
大表的切割
mapjoin
分桶
==========
华为电话面试
1.介绍项目
2.数据库优化
3.事实表和维度表区别
4.雪花模型和星形模型
5.生产环境优化
我们没有生成环境的权限的
6.两张表a和b a表有十亿数据,b表为空,把a表的十亿数据用存储过程移到b表,简述使用存储过程
7.介绍分区和每个分区在什么情况使用
8.介绍索引和在哪些情况使用
================
招商:
1.问最近的项目
2.sql性能优化
3.索引有哪些?分别介绍一下
4.索引在数据库中的结构? 位图索引和btree索引解释下
5.分区有哪些?
6.问调度是怎么做的?
设计脚本的运行时间,以及运行的前后顺序,以及脚本之间的依赖关系
kettle的作业调度
crontab+kettle的linux脚本:
-
-
-
-
- $KETTLE_HOME/kitchen.sh -file=作业文件的位置
-
-
-
其他的调用工具(只有调度功能的工具):CTM ozzie
7.脚本上线之后你都有遇到过哪些问题?是怎么解决的?
第一个是脚本运行时间太长,可能是出现了数据倾斜;
第二个可能是会出现数据和预期不一致的情况,首先看是否是调度工具的问题,其次是逻辑的问题,然后是上游数据的问题。
8.假如有a,b两张表,如果a表有数据就用a表的数据,如果a表没有,就用b表的数据,你怎么做?
select case when a.name is null then b.name else a.name end
from a left join b on a.id=b.id;
9.在插入数据的时候,有索引和没有索引有什么区别吗?
插入数据的时候有索引效率会更慢,因为修改表格的同时还需要修改索引
10.数据迁移你是具体是怎么做的?
旧项目是oracle
新项目是hive
将所有的oracle表格,全部挪到hive数据库中; 使用sqoop抽取表格的数据
将所有的需求挪到hive数据库中; 使用hql将sql重新写一遍
将所有的存储过程、函数等代码块也全部挪到Hive中。 使用hql,写成一个.sql文件重新运行
11.对业务方面了解多少?
和客户相关的业务:
新用户的增长量
用户的流失量
老用户的回归比例
活跃用户的比例
不同渠道的用户拉新比例
[不同渠道的]用户的转换率
[不同渠道的]用户的收益
财务相关的业务:
每月财务报表
每月不同部门的支出和收入
部门的预期收入和实际收入模型
毛利润和净利润
利润比例
不同维度的开销的比例
…
绩效相关的业务:
每个团队每月的销售增长比例,实际增长值
团队的预期销售和实际销售额
团队内部员工的销售比例
不同团队的不同产品的销售比例
个人销售的增长情况
不同类型不同产品的增长率、增长值
每月融资增长比例
…
12.问我项目里面写的对数据以年、月、日等维度,进行指标数据的计算,具体是怎么操作的?
指标文档和规格说明书里面,会写维度、口径、范围、数据源、展示形式、调度频率
13.数据仓库的分层?具体是怎么分的?
14.都有哪些主题?
==================
赛意:
1.自我介绍
我是谁,是哪里人,工作了几年(根据毕业时间来说),比较熟悉的工具有oracle数据库,编写sql语句和存储过程等,hive数据的操作,hql的编写,python脚本的编写,linux的基本操作和使用也比较熟悉,以前工作中还搭建过Hadoop的本地工作环境等等。
2.oracle用过哪些函数?
3.在一个字符串里面,我想截取某个逗号后面的字符串,怎么做?
可以使用代码块的for循环来实现
declare
str varchar2(50);
l number;
c number;
begin
str:=‘abcd,hijk,okkk,ppp,999’;
l:=length(str);
c:=0;
for i in 1…l loop
if substr(str,i,1)=‘,’ then
c:=c+1;
if c=3 then
dbms_output.put_line(substr(str,i+1));
end if;
end if;
end loop;
end;
4.有一个字符串超过字符串的最长长度了怎么办?
先尝试去掉所有的空格,再试下去掉其他的符号,例如tab , / ‘’ “”
还不行就只能截断字符串了
5.去空格用什么去除?
replace(’ ‘,’')
6.建表的时候索引和主键是怎么用的?
7.主键索引和唯一索引有什么特性?
8.etl工具用的是什么?
9.etl集成的时候常见的错误有哪些?长度 数据类型
10.数据仓库的架构?每一层是做什么用的?
11.事实表和维度表放在那一层?你们数据仓库里有哪些维度表?
12.有做过SQL优化吗?怎么做的?
13.怎么让执行计划强行走索引?怎么强行走全表扫描?
优化器 /*+ index(表名,索引名) / /+ full(表名) */
14.做表更新的时候,怎么做优化?
更新数据的多少
=============================
华为电面
1.自我介绍
2.介绍项目:
3.之前用的oracle和hvie那个比较多?
都用得比较多的
4.数据仓库有几层
四层,ODS临时存储层,DW数据仓库,DM数据集市,DA报表层 (面试官:有DA层吗?我:嗯,DA报表层。面试官……)
5.数据库优化有做过吗
6.怎么查看执行计划
7.PL/SQL跟CMD查看有什么区别
8.缓慢变化维了解吗
9.星型模型跟雪花模型的区别
10.索引的类型
11.表分区有哪些(回答了列表分区,散列分区,范围分区跟组合分区,面试官对散列分区不解……)
12.oracle的存储过程 (存储过程:是有名字的代码块 procedure)
13.lunix的文件是怎么解压的(回答tar,面试官跟我说不是,我懵了)
14.lunix常用命令
15.hadoop平台的组件
===============
平安10-20
1、如何使用拉链表,及缓慢变化维的理解
拉链表是记录每一个数据前后变化的表格,拉链表常见的有两种记录方式,一种是用行的方式记录每一次的数据变更,另一种是使用列的方式,记录最近的几次变更,行的方式更常见。
缓慢变化维就是用哪种字段哪个方法去记录前后的变化。
2、oracle更新的操作
3、汇总统计数据与预期不符,如何处理
检查sql语句或者存储过程的逻辑,按照运行的步骤逐层进行检查和分析
4、sqoop、kettel、kafka是离线操作还是实时操作
sqoop、kettel是离线的
kafka是实时的
5、在hive中,表格的压缩方法和压缩格式
NONE RECORD BLOCK
6、hive中各个压缩效率的区别
7、缓慢变化维:列记录和行记录的区别
8、在最近的项目中,最近的字段
9、在hive和oracle中,分别如何操作存储过程
hive中的存储过程:
create procedure 过程名
begin
declare 变量名 数据类型;
if 筛选 then
语句
end if;
for i in 范围 loop
语句
end loop;
end;
10、mapreduce和spark的区别
11、在hive中,如何行列转换
Hive里面没有Pivot()方法,使用case when做行列转换
12、分析函数有那些?over()
13、排名函数有那些?区别?
14、数据倾斜的原因及解决办法
15、项目中用到的数据抽取工具
kettle sqoop python
16、对帆软软件熟悉不?有使用那些帆软软件?
用过这个工具,整体操作还算比较熟悉
普通报表、报表模板、插入图标、模板参数
===================
10.21面试总结
腾讯面试:
1.表连接(左连接,左边一个a,右边两个a,结果是什么)
a a
a a
2.左连接的数据有什么特点(想要的点是左边有的不为空)
获取两个表的相同数据,然后再显示左边表的独有数据,右边没有匹配的就显示为空
3.sql优化
4.数据倾斜
什么时候会出现?
出现的表现和状态是什么样?
怎么解决? 设置合理的分区、拆分大表、设置mapjoin优化、空值的赋值、语句的关键字调整、部分开关的设置(aggr聚合计算开关还有负载均衡开关等等)
5.数仓架构
6.增量更新(左连接然后增量更新,面试官想要的答案)
华为面试:
1.存储过程用过吗?怎么用
数据更新的时候用的最多,需要处理的数据比较复杂,需要以行为单位处理数据的时候,就需要使用存储过程借助游标去操作数据。
2.项目–指标计算,工作中具体是怎么计算的(问的很细)
用户相关的指标:新增用户、不同的用户新增渠道、用户的pv和uv的数据计算、老用户的回归数据计算、用户的活跃度计算、用户转换率、不同渠道的成本和利润比例计算
pv:page view
uv:unit view
销售:每月和每年累计的总体毛收入、不同渠道和产品的交易收入、资产管理的业务收入
3.再举一个做过的项目
介绍一下自己的项目:
我上一个项目,是做的华融湘江银行的客户数据的迁移项目,这个项目主要是对之前的老客户系统进行数据和架构上的优化,将oracle的系统数据整体迁移到hadoop平台使用Hive数据库进行管理。
在这个项目里面,我们主要使用到的是用python脚本去读取数据库的数据,使用python的函数对不同的模块和数据流程进行封装,然后对项目的需求进行迁移,使用hql去替换之前oracle中写好的sql语句和存储过程等。
这个新的项目中,用到的工具和组件,包括python进行数据的抽取,使用hdfs进行数据的存储,在hive数据库里面,我们主要是做离线数据的处理,数据计算引擎是使用的mr。
在项目中,我主要是负责对客户、协议、事件等主题库进行表格的数据迁移,以及对应的主题库和集市层数据进行需求的迁移。
我们的项目主要是分成四层,首先是在ODM里面直接读取不同的数据源的数据,然后通过SDM将ODM贴源层的数据进行标准化的处理,主要是统一数据格式、数据类型和长度、数据的默认值、数据计算的单位等等,再将数据抽取到FDM中分不同的主题库保存,然后根据不同的业务部门的需求,将数据计算之后保存在ADM集市中,后面如果数据需要进行展示,会继续抽取和计算数据到MDM的报表层中。
4.hive优化和sql语句优化
5.分析函数 hive和oracle是一样的
我们平时和over()开窗一起使用的函数,包括了聚合函数sum count avg max min、排名函数row_number rank dense_rank 和数据平移lag lead的函数
6.日月环比除了平移函数还能怎么做
通过表连接来做
================================