数仓分层 数仓和普通数据库区别
传统的分层就是分为3层 即ODS,DW,DM层,在我们项目里面,是将DW层细分为了DWD和DWS层,DWD主要用来存事实表
源数据层:原始数据。来源包含业务库、埋点日志、其他数据源
ODS层:Operate data store,操作数据存储,是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的ETL之后,装入本层。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。但是,这一层面的数据却不等同于原始数据。在源数据装入这一层时,要进行诸如去噪(例如有一条数据中人的年龄是 300 岁,这种属于异常数据,就需要提前做一些处理)、去重(例如在个人资料表中,同一 ID 却有两条重复数据,在接入的时候需要做一步去重)、字段命名规范等一系列操作。
DW层:Data warehouse,数据仓库层。在这里,从ODS层中获得的数据按照主题建立各种数据模型。例如以研究人的旅游消费为主题的数据集中,便可以结合航空公司的登机出行信息,以及银联系统的刷卡记录,进行结合分析,产生数据集。在这里,我们需要了解四个概念:维(dimension)、事实(Fact)、指标(Index)和粒度( Granularity)
(DW可以分为DWD和DWS层)
DWD:data warehouse detail 细节数据层。是业务层与数据仓库的隔离层。这一层主要解决一些数据质量问题和数据的完整度问题。比如用户的资料信息来自于很多不同表,而且经常出现延迟丢数据等问题,为了方便各个使用方更好的使用数据,我们可以在这一层做一个屏蔽。 dwd 主要是对 ods 层做一些数据清洗和规范化的操作。
DWS层:data warehouse service 服务数据层, 轻度汇总层,从ODS层中对用户的行为做一个初步的汇总,抽象出来一些通用的维度:时间、ip、id,并根据这些维度做一些统计值,比如用户每个时间段在不同登录ip购买的商品数等。这里做一层轻度的汇总会让计算更加的高效。整合汇总成分析某一个主题域的服务数据,一般是宽表。DWS层主要是用来存储对数据进行小量聚合的,DWS层可以解决企业中百分之70的问题,剩下的解决不了的那就是再进行一次高度聚合,将结果放在DM层中。
dws 和 dwd 有没有依赖关系主要看有没有这种需求。站在一个理想的角度来讲,如果 ods 层的数据就非常规整,基本能满足我们绝大部分的需求,这当然是好的,这时候 dwd 层其实也没太大必要。 但是现实中接触的情况是 ods 层的数据很难保证质量,毕竟数据的来源多种多样,推送方也会有自己的推送逻辑,在这种情况下,我们就需要通过额外的一层 dwd 来屏蔽一些底层的差异。
DM层(data market):又称数据集市或宽表。按照业务划分,如流量、订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询,OLAP分析,数据分发等。数据生成方式:由轻度汇总层和明细层数据计算生成。更深层的数据处理。比如这个项目当中的DWS层是统计过去30天内的,但是在DM层中会有统计过去90天的指标,可以理解为DM层是DWS层的又一次聚合。
APP层:应用层是根据业务需要,由前面三层数据统计而出的结果,可以直接提供查询展现,或导入至Mysql中使用。数据生成方式:由明细层、轻度汇总层,数据集市层生成,一般要求数据主要来源于集市层。该层主要是提供数据产品和数据分析使用的数据,一般会存放在es、mysql等系统中供线上系统使用。比如我们经常说的报表数据,或者说那种大宽表,一般就放在这里。
数据仓库构建步骤:
第一步:选择业务流程
维度方法的基础是首先确认哪些业务处理流程是数据库需要覆盖的,因此建模的第一个步骤是描述需要建模的业务流程,描述业务流程,可以简单的使用文本记录下俩或者使用MPMN(业务流程建模标注)的方法,也可以使用UML等.
第二步:确认粒度
粒度用于确定事实表中表示的是什么,在选择事实表存储最细粒度的事务记录,每小时更新增量,凌晨2两点更新昨天全量
第三步:确认维度
维度是指分析的各个角度,如版本、渠道、功能
维度的层次(Hierarchy)和级别(Level)
维度表随时间变化,缓慢维度变化:修正、迁移、新增
第四步:确认事实
将原始表与维度表进行关联,生成事实表
还需要建立一些相关的中间汇总表,以方便查询
第五步:建立物理模型
oozie怎么用的?
可以从以下几个方面回答:
- 怎么开发workflow,调度哪些内容,比如hive,shell等
- 怎么设置任务调度,定时时间,方式,
- 结合项目说明
项目里具体hive做的哪一块
ETL中数据清洗,数据处理,数据分析。结合项目业务来讲。
华为不是用的oozie 用的别的调度工具
其他调度工具还有Azkaban、Airflow等,可以了解一下。
hive的自定义函数实现了什么接口
1)自定义UDF需要继承:org.apache.hadoop.hive.ql.UDF
2).需要evaluate函数,evaluate函数支持重载。
还有UDAF、UDTF
hive举几个会发生mr过程的语句例子
count,sum ,min ,avg ,max 函数,各种join操作
hive外部表应用场景
加载映射原始数据到Hive表
scala的数据类型有哪些
Scala 的数据类型和Java是类似的,所有Java的基本类型在scala包中都有对应的类,将Scala代码编译为Java字节码时,Scala编译器将尽可能使用Java的基本类型,从而提供基本类型的性能优势,8种基本数据类型,位于scala
包中:Byte,Short,Int,Long,Float,Double,Char,Boolean
Any :Any是所有其他类的超类
AnyRef:Scala里所有引用类(reference class)的基类
Unit:只有一个实例值 (),方法返回Unit 相当于返回了Java中的void
Null:每个引用类的子类
Nothing:在Scala的类层级的最低端;它是任何其他类型的子类型,可以赋值给任何其他类型,用于异常,表明不正常的返回
String类型
scala的偏函数能和我说说吗?
在Scala中,偏函数是具有类型PartialFunction[-T,+V]的一种函数。T是其接受的函数类型,V是其返回的结果类型。偏函数最大的特点就是它只接受和处理其参数定义域的一个子集,而对于这个子集之外的参数则抛出运行时异常。这与Case语句的特性非常契合,因为我们在使用case语句是,常常是匹配一组具体的模式,最后用“_”来代表剩余的模式。如果一一组case语句没有涵盖所有的情况,那么这组case语句就可以被看做是一个偏函数。
https://blog.csdn.net/bluishglc/article/details/50995939
谈谈scala的柯里化
柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
例如:
def add(x:Int,y:Int)=x+y
柯里化后:
def add(x:Int)(y:Int)=x+y
scala的apply和unapply方法是什么作用
apply方法
通常,在一个类的半生对象中定义apply方法,在生成这个类的对象时,就省去了new关键字。
unapply方法
可以认为unapply方法是apply方法的反向操作,apply方法接受构造参数变成对象,而unapply方法接受一个对象,从中提取值。
appay和unapply方法会被隐式调用。
scala里面定义一个集合有哪些方法
常用的集合有三种:List,Set,Map
List 继承至 Seq,集合中的元素是可以重复的 val l = List(1, 1, 2, 2, 3, 5)
Set 中的元素是不可重复的 val s = Set(1, 1, 2, 2, 3, 5)
Map 中的元素呈现 key -> value 的形式,其中第一个参数是映射的键,第二个参数是映射的值。且Map中每一个元素的键是唯一的。
val m = Map(1 -> 1, 1 -> 3, 2 -> 3, 3 -> 4, 4 -> 4, 5 -> 7)
以上内容, 还可以通过其他转换得到
scala的元组定义之后可变吗
映射是K/V对偶的集合,对偶是元组的最简单形式,元组可以装着多个不同类型的值
元组在Scala语言中是一个非常有用的容器对象。与列表一样,元组也是不可变的;但是与列表不同,元组可以包含不同类型的元素