数据仓库问题总结

2019-05-26 10:03:06 浏览数 (1)

1.在关系模型中,实现“关系中不允许出现相同的元组”的约束是通过 “主键” 完成的。

2.在MySql中,concat函数的作用是是将传入的参数连接成为一个字符串,则concat(’aaa’,null,’bbb’)的结果是( NULL)

3.关于添加带自增列的数据:自增的列无须显式地添加。如需添加全部字段数据时,仅需表名,可省略全部字段

4.YARN支持的调度语义:

代码语言:javascript复制
    请求节点nodeX上5个Container:虚拟CPU个数为2,内存量为2GB
代码语言:javascript复制
    请求机架rackX上3个Container:虚拟CPU个数为4,内存量为3GB

5.SQL Server的描述:

关系型数据库、企业级数据库、客户机/服务器数据库

6.在SQL Server中,要防止大于100的数被保存到int类型的列,可以使用----检查约束

7.ETL工具:datastage、kettle、tableau

8.OLAP的核心是:多维分析

9.在文件a.txt中查找某字符串'str' grep str a.txt

10.数据库系统中采用封锁技术的目的是为了保证一致性

11.关于Hive 中的压缩格式 RCFile、TextFile、SequenceFile

代码语言:javascript复制
TextFile是Hive默认格式,不作压缩,磁盘及网络开销较大。可以结合Gzip, Bzip2使用,但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作
代码语言:javascript复制
SequenceFile 是Hadoop API提供支持的一种二进制文件,具有使用方便,可分割,可压缩的特点,支持三种压缩选择:NONE, RECORD, BLOCK。RECORD压缩率低,一般建议使用BLOCK压缩
代码语言:javascript复制
相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较小,且具有较好的压缩比和查询响应

12.查询每个部门中工资最高的员工。两张表(员工表和部门表)

select d.Name as Department ,e.Name as Employee,e.salary from Emplyee e inner join Department d on e.Department = d.Id where (e.DepartmentId, e.salary) in (select DepartmentId,max(Salary) from Employee group by DepartmentId);

13.客户隐私管理是银行业的重中之重,现需要对数据仓库中多张表中存储的不同格式的客户手机号虚拟出一个"手机号ID",该ID会被用于公网中的系统间调用,你会如何生成该ID,并请设计手机号和ID的映射关系表结构?请注意:手机号和ID的关系一旦生成,不应再发生改变;无法通过ID倒推出手机号

(1)先按照将手机号标准化,剔除不符合11长度的手机号,剔除开头不是1的手机号等等。

(2)对新增手机号排序后生成一个自增ID,该ID需大于已存在ID的最大值

(3)对已有手机号保留之前的ID

(4)表结构参考【ID,手机号,ID生成时间】

14.数仓ETL过程中,数据探索阶段主要包括哪些内容?

(1)收集所有的源系统的文档、数据字典等内容

(2)收集源系统的使用情况,如谁在用、每天多少人用、占多少内存空间等内容

(3)判断出数据的起始来源

(4)通过数据概况来对源系统的数据关系进行分析。

15.数据仓库中为什么要做拉链表?什么样的场景比较适合用拉链表?举例说明拉链表的实现过程?

1)记录下数据所有的状态变化的记录,如数据是按日批次更新,相当于实现了数据每日切片的功能。

2)适合状态会发生变化的数据,并且每次数据变化量比较小,而历史状态又比较重要的数据,数据必须要有主键。

3)首先需要给每条数据增加两个字段:链头和链尾,记录了这条数据的有效起始时间和结束时间,批量更新时,将历史数据中删除和被更新的数据的链尾置为当前时间,表示这些数据的链路被关闭。将新数据中新增的和更新历史数据的数据的链头设置为当前时间,链尾设置为一个很大的时间,表示这些数据新开辟一条链路并且为当前有效。在对比数据的时候根据主键对比整条数据是否发生变化,只要有一个字段的值发生变化即视为该条数据有更新。

16.spark代码分析

lines = sc.textFile("data.txt")

//从外部文件中定义了一个基础的RDD,数据集并未加载或者执行,lines仅仅是一个指向文件外部文件的指针 lineLengths = lines.map(lambda s: len(s))

//lineLengths定义了一个map转换结果的RDD,数据集并未加载或者执行,同样的,lineLengths并未执行,仅仅是一个指针 lineLengths.persist() // lineCount = lineLengths.count()

//count()为一个action操作,数据开始加载运行,会将所有的RDD加载乳内存进行计算,并返回结果 totalLength = lineLengths.reduce(lambda a, b: a b)

2) 该步指定lineLengths在第一次计算后会被加入到内存中 在第四行,lineLengths被首次计算,加入内存 在第五行,lineLengths再次被使用到,直接采用内存中的lineLengths进行计算,而不需要再次计算lineLengths的值

17.事实表和维度表的概念以及怎么设计?

事实表:

每个数据仓库都包含一个或者多个事实数据表。事实数据表可能包含业务销售数据,如现金登记事务所产生的数据,事实数据表通常包含大量的行一般事实表中只存放数字或者一些Flag用来统计(Count),如收益、数量、支出等

维度表(Dimension Table):

维度表可以看作是用户来分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。

事实表的设计是以能够正确记录历史信息为准则,维度表的设计是以能够以合适的角度来聚合主题内容为准则。

18.hive表关联查询,什么情况下会发生数据倾斜,应该如何解决?

倾斜原因:

map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特性、建表时考虑不周等原因造成的reduce 上的数据量差异过大。

解决方案:

(1)参数调节:

hive.map.aggr = true

hive.groupby.skewindata=true

有数据倾斜的时候进行负载均衡,当选项设定位true,生成的查询计划会有两个MR Job。

第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;

第二个MR Job再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。

(2)SQL 语句调节:

1)选用join key分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表做join 的时候,数据量相对变小的效果。

2)大小表Join:

使用map join让小的维度表(1000 条以下的记录条数)先进内存。在map端完成reduce.

3)大表Join大表:

把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null 值关联不上,处理后并不影响最终结果。

4)count distinct大量相同特殊值:

count distinct 时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

0 人点赞