Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行,所以说 Hive 是基于Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架,对存储在HDFS 中的数据进行分析和管理。

一、Hive 架构

用户接口:CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

元数据:元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。

Hadoop:使用 HDFS 进行存储,使用 MapReduce 进行计算

驱动器:主要包含以下几类:

a.解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
        b.编译器(Physical Plan):将AST编译生成逻辑执行计划。
        c.优化器(Query Optimizer):对逻辑执行计划进行优化。
        d.执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

Hive解析成MR的过程:

Hive通过给用户提供一系列交互接口,接收到用户的指令(sql语句),结合元数据(metastore),经过Driver内的解析器,编译器,优化器,执行器转换成mapreduce(将sql转换成抽象语法树AST的解析器,将AST编译成逻辑执行计划的编译器,在对逻辑执行计划进行优化的优化器,最后将逻辑执行计划转换成mapreduce),提交给hadoop中执行,最后将执行返回的结果输出到用户交互接口。

二、Hive与传统数据库的区别

由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。

1.查询语言:由于 SQL被广泛的应用在数据仓库中,因此,专门针对 Hive的特性设计了类 SQL的查询语言 HQL。

2.数据存储位置:Hive 是建立在 Hadoop之上的,所有 Hive的数据都是存储在HDFS中的。
数据库则可以将数据保存在块设备或者本地文件系统中。

3.数据格式:Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive中默认有三个文件格式 TextFile,SequenceFile以及 RCFile)。

4.数据更新:由于 Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES添加数据,使用 UPDATE … SET修改数据。

5.索引:Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce的引入, Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。 数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive不适合在线数据查询。

6.执行:Hive 中大多数查询的执行是通过 Hadoop提供的 MapReduce来实现的(类似 select * from tbl的查询不需要 MapReduce)。
数据库通常有自己的执行引擎。

7.执行延迟:之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive执行延迟高的因素是 MapReduce框架。由于 MapReduce本身具有较高的延迟,因此在利用 MapReduce执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

8.可扩展性:由于 Hive是建立在 Hadoop之上的,因此 Hive的可扩展性是和 Hadoop的可扩展性是一致的。数据库由于 ACID语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle在理论上的扩展能力也只有 100台左右。

9.数据规模:由于Hive建立在集群上并可以利用 MapReduce进行并行计算,因此可以支持很大规模的数据;数据库可以支持的数据规模较小。

三、Hive 数仓层级,为什么要对数据仓库分层

数据仓库标准上可以分为三层:ODS(原始数据层)、DW(数据仓库层)、ADS(应用层)。

原始日志层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。

数据仓库层(DW):也称为细节层,DW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。

DWD(数据明细层):存储明细数据,此数据是最细粒度的事实数据。该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。

DWM(中间层):存储中间数据,为数据统计需要创建的中间表数据,此数据一般是对多个维度的聚合数据,此层数据通常来源于DWD层的数据。
        DWS(轻度聚合层):存储宽表数据,此层数据是针对某个业务领域的聚合数据,业务层的数据通常来源与此层,为什么叫宽表,主要是为了业务层的需要在这一层将业务相关的所有数据统一汇集起来进行存储,方便业务层获取。此层数据通常来源与DWD和DWM层的数据。

( 注:在实际计算中,如果直接从DWD或者ODS计算出宽表的统计指标,会存在计算量太大并且维度太少的问题,因此一般的做法是,在DWM层先计算出多个小的中间表,然后再拼接成一张DWS的宽表。由于宽和窄的界限不易界定,也可以去掉DWM这一层,只留DWS层,将所有的数据在放在DWS亦可。)
应⽤层(ADS):前端应用直接读取的数据源;根据报表、专题分析的需求而计算生成的数据。

维表层(Dimension):最后补充一个维表层,维表层主要包含两部分数据:

a.高基数维度数据:一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别.

b.低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维表。数据量可能是个位数或者几千几万.

数仓分层带来的好处:

1.每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解;

2.减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算;

3.统一数据口径:通过数据分层,提供统一的数据出口,统一对外输出的数据口径;

4.复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题。

四、内部表和外部表

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table)

1.内部表数据由Hive自身管理,外部表数据由HDFS管理;
2.内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
3.删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
4.对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

使用场景:

1.外部表在删除时不会清理HDFS上的数据,所以相对较安全,同时由于其指定目录的特性,在跨部门合作中经常用到。所以不小心删除外部表后,可以创建一个新表指定到(location ‘/hive/external_table/’)这个位置,那么数据就会恢复。

2.对于一些原始日志文件,同时被多个部门同时操作的时候就需要使用外部表,如果不小心将meta data删除了,HDFS上 的data还在可以恢复,增加了数据的安全性。

五、Hive中的视图

Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 ,当查询引用视图时,Hive才将视图的定义与查询结合起来。视图可以简化复杂的查询。

注意:
1.创建视图时,如果未提供列名,则将从 SELECT 语句中自动派生列名;
2.视图是只读的,不能用作 LOAD / INSERT / ALTER 的目标;
3.删除基表并不会删除视图,需要手动删除视图;

六、Hive分区和分桶

分区:hive里分区的概念是根据“分区列”的值对表的数据进行粗略划分的机制,在hive存储上就体现在表的主目录(hive的表实际显示就是一个文件夹)下的一个子目录,这个文件夹的名字就是我们定义的分区列的名字,没有实际操作经验的人可能会认为分区列是表的某个字段,其实不是这样,分区列不是表里的某个字段,而是独立的列,我们根据这个列存储表的里的数据文件。使用分区是为了加快数据分区的查询速度而设计的,我们在查询某个具体分区列里的数据时候没必要进行全表扫描。

分桶:table和partition都是目录级别的拆分数据,bucket则是对数据源数据文件本身来拆分数据。使用桶的表会将源数据文件按一定规律拆分成多个文件,要使用bucket。物理上,每个桶就是表(或分区)目录里的一个文件,桶文件是按指定字段值进行hash,然后除以桶的个数(创建的时候设置),最后去结果余数,因为整数的hash值就是整数本身。单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,所以会采用分桶技术将数据更细粒度的划分和管理。

我们首先要打开hive对桶的控制,命令如下:

set hive.enforce.bucketing = true

分桶的好处:

1、为了保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)
2、分桶表数据进行抽样和JOIN时可以提高MR程序效率

注意:
1、分区使用的是表外字段,分桶使用的是表内字段
2、分桶是更细粒度的划分、管理数据,更多用来做数据抽样、JOIN操作

七、Hive UDF

常见自定义函数

UDF:User-Defined-Function,用户自定义函数,一对一的输入输出。(最常用的)。

UDTF:User-Defined Table-Generating Functions,用户自定义表生成函数。一对多的输入输出,比如 lateral view explore()

UDAF:User-Defined Aggregation Function,用户自定义聚合函数,多进一出,比如 count/max/min。

用UDF函数解析公共字段,用UDTF函数解析事件字段

自定义UDF:继承UDF,重写evaluate方法

自定义UDTF:继承GenericUDTF,重写3个方法,initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close

八、Hive 存储格式

Hive 中的存储格式有TextFile、SequenceFile、RCfile 、ORCfile

1.TextFile:默认格式, 存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,压缩后的文件不支持split,Hive不会对数据进行切分,从而无法对数据进行并行操作。并且在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比SequenceFile高几十倍。

2.SequenceFile:SequenceFile是Hadoop API提供的一种二进制文件支持, 存储方式为行存储,其具有使用方便、可分割、可压缩的特点

SequenceFile支持三种压缩选择: NONE , RECORD , BLOCK 。Record压缩率低, 一般建议使用BLOCK压缩

优势是文件和hadoop api中的MapFile是相互兼容的

3.RCFile:存储方式: 数据按行分块,每块按列存储。结合了行存储和列存储的优点:

首先,RCFile 保证同一行的数据位于同一节点,因此元组重构的开销很低;

其次,像列存储一样,RCFile 能够利用列维度的数据压缩,并且能跳过不必要的列读取;

4.ORCFile:存储方式:数据按行分块每块按照列存储。压缩快、快速列存取。效率比rcfile高,是rcfile的改良版本。

总结:

1.相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应

2.数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势

九、行式存储&列式存储

行式存储:数据按照行数据为基础单元进行组织存储

优点:

具有随机写入优势,特别是频繁写和更新操作。对于写入的每条记录,只需要内存拼接好整行记录,一次性写入到磁盘块中,单挑记录数量年小于单个磁盘块就只需要1次IO操作。

缺点:

a.读取冗余。在查询操作中计算机是按照磁盘块为基本单位进行读取,同一个磁盘块中其他记录也需要读取。然后加载至内存,在内存中进行过滤处理。即使查询只涉及少数字段,也需要读取完整的行记录。(行存储数据会引入索引和分库分表技术来避免全量读取)

b.数据压缩。每行数据有不同类型数据,数据压缩率较低。

列式存储:数据按照列为单元进行集中存储。同一列的数据顺序存储在同一个磁盘块中,其他列同样集中顺序存储。顺序写在前列后面或单独一个文件。

优势:

1.大量查询操作优势。对于目标查询,列存只需要返回目标列的值。而且列值在磁盘中集中存储,会减少读取磁盘块的频次,较少IO的数量。最后再内存中高效组装各列的值,最终形成查询结果。另外列式记录每一列数据类型同质,容易解析。每列存储是独立的可以并发处理,进一步提升读取效率。
        2.数据压缩优势。因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率。如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。整体上减轻IO的频次。
        3.映射下推(Project PushDown)、谓词下推(Predicate PushDown)。可以减少不必要的数据扫描,尤其是表结构比较庞大的时候更加明显,由此也能够带来更好的查询性能

缺点:

写入更新短板。列式存储写入前需要将一条记录拆分成单列,分别追加写入到列所在的磁盘块中,如果列比较多,一条记录就会产生多次磁盘块的IO操作。对于实时的逐条写入性能会比行式弱。

但是对于大量的批写入,列可以在内存中拆分好各分列,然后集中写入,性能和行式数据比不一定差。

业务场景适应性分析(https://blog.csdn.net/rongxiang20054209/article/details/115287848)

联机事物处理(OLTP)、联机分析处理(OLAP)分别适合于行式存储、列式存储数据库。实际选型时,在时间允许的前提下,需要深入了解业务场景的特点,进行场景模拟测试后,根据评测结果最终选择合适的数据库。例如在联机分析处理场景中,如果大量的查询是读取的记录中的大多数或所有字段,主要由单条记录查询和范围扫描组成,则面向行的存储布局的数据库会更适合。

十、Hive动态分区

hive 可以通过分区字段减少数据查询范围,避免全表扫描,提高查询速度和性能的。Hive 的分区主要有两种:静态分区 和 动态分区

静态分区

Hive的静态分区,实际上就是手动指定分区的值为静态值,这种对于小批量的分区插入比较友好。

动态分区

当往hive分区表中插入数据时,如果需要创建的分区很多,比如以表中某个字段进行分区存储,则需要复制粘贴修改很多sql去执行,效率低。因为hive是批处理系统,所以hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称,从而建立分区。

动态分区表的属性

使用动态分区表必须配置的参数 :

set hive.exec.dynamic.partition =true(默认false),表示开启动态分区功能
        set hive.exec.dynamic.partition.mode = nonstrict(默认strict),表示允许所有分区都是动态的,否则必须有静态分区字段

动态分区相关的调优参数:

set  hive.exec.max.dynamic.partitions.pernode=100 (默认100,一般可以设置大一点,比如1000)表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。

set hive.exec.max.dynamic.partitions =1000(默认值) 表示一个动态分区语句可以创建的最大动态分区个数,超出报错

set hive.exec.max.created.files =10000(默认) 全局可以创建的最大文件个数,超出报错。

十一、Hive 行转列

行转列

关键函数:

1.collect_set()、collect_list():
        collect_set( )函数只接受基本数据类型,作用是对参数字段进行去重汇总,返回array类型字段;
        collect_list()函数和collect_set( )作用一样,只是前者不去重,后者去重。
2.concat_ws():
concat_ws (separator, 字符串A/字段名A, 字符串B/字段名B… )是concat的特殊形式,第一个参数是分隔符,分隔符会放到要连接的字符串之间,分隔符可以是字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL,函数会忽略任何分隔符参数后的 NULL值。但是concat_ws( )不会忽略任何空字符串。(然而会忽略所有的 NULL),如果参数为string类型数组则合并数组内字符串。
例:concat_ws( ',', [ 'a ', 'b'])–> 'a,b'

行转列基本语法:

select 分类字段,concat_ws(',',collect_set(合并字段))  as 别名 from table_name group 分类字段;

/* 原始数据
name       gender          times
张三         男            唐
李四         男            唐
王五         男            明
赵六         男            明
*/-- 先用collect_set将列拼接在一起,然后再通过concat_ws进行展开拼接
SELECT a.gender_times, concat_ws(';',collect_set(a.name)) name
FROM
(SELECT name, concat(gender, '_','times') gender_timesFROM hero_info
) tmp
GROUP BY t.gender_times/*查询结果
gender_times    name
男_唐     张三;李四
男_明     王五;赵六

列转行

关键函数:

1.split: 将一个字符串按照指定字符分割,结果为一个array;
2.explode: 将一列复杂的array或者map拆分为多行,它的参数必须为map或array;
3.lateral view: lateral view udtf(字段名)表别名/表临时名as列别名/列临时名。lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateralview再把结果组合,产生一个支持别名表的虚拟表。

列转行基本语法:

select  字段,字段别名  from table_name lateral view explode(split(拆分字段,分隔符))表别名 as 字段别名;

/*原始数据
province       city
河南           郑州市,开封市,洛阳市
河北           石家庄市,保定市
湖南           长沙市,岳阳市,常德市
*/-- addr为表名
SELECTprovince, city_n
FROM addr
LATERAL VIEW explode (split(city,',')) addr_tmp AS city_n/*
-- 查询结果
河南      郑州市
河南      开封市
河南      洛阳市
河北      石家庄市
河北      保定市
湖南      长沙市
湖南      岳阳市
湖南      常德市
*/

十二、Lateral view 是否会产生shuffle

不会,看执行计划就会发现,没有reduce任务。这里的Join代表的是两份数据联接到一起的意思,并不是真正的意义上的join。参考(你真的了解Lateral View explode吗?--源码复盘 - 知乎)

十三、order by、sort by、cluster by 区别

order by:对数据进行全局排序,只有一个reduce工作
sort by:每个mapreduce中进行排序,一般和distribute by使用,且distribute by写在sort by前面。当mapred.reduce.tasks=1时,效果和order by一样
distribute by:类似MR的Partition,对key进行分区,结合sort by实现分区排序
cluster by:当distribute by和sort by的字段相同时,可以使用cluster by代替,但cluster by只能是升序,不能指定排序规则

十四、开窗函数 over()

over()窗口函数的语法结构

分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)

注:我们在使用over()窗口函数时,over()函数中的这三个函数可组合使用也可以不使用。

over()函数中的三个函数讲解

1.order by:order by是排序的意思,是该窗口中的
        2.partition by:partition by可理解为group by 分组。over(partition by 列名)搭配分析函数时,分析函数按照每一组每一组的数据进行计算的。

3.rows between 开始位置 and 结束位置:是指定窗口范围,比如第一行到当前行。而这个范围是随着数据变化的。over(rows between 开始位置 and 结束位置)搭配分析函数时,分析函数按照这个范围进行计算的。

窗口范围说明:
我们常使用的窗口范围是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行),常用该窗口来计算累加。

PRECEDING:往前

FOLLOWING:往后
CURRENT ROW:当前行
UNBOUNDED:起点(一般结合PRECEDING,FOLLOWING使用)
UNBOUNDED PRECEDING 表示该窗口最前面的行(起点)
UNBOUNDED FOLLOWING:表示该窗口最后面的行(终点)

比如说:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行)
ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行)
ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到当前行)
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示当前行到终点)

over()函数中如果不使用这三个函数,窗口大小是针对查询产生的所有数据,如果指定了分区,窗口大小是针对每个分区的数据。

1.over() 默认此时每一行的窗口都是所有的行

select *,count(1) over() from business;

2.over(order by orderdate):orderdate=1 的窗口只有一行,orderdate=2的窗口包括orderdate=2017-01-01, orderdate=2017-01-02

3.over(partition by name)每一行根据 name来区分窗口 

select *,sum(cost) over(partition by name) from business;

4.over(partition by name order by id) 每一行根据 name来区分窗口,再根据order by 取具体的范围 

select *,sum(cost) over(partition by name order by orderdate) from business;

hive over窗口函数的使用 - 彬在俊 - 博客园

十五、row_number、rank、dense_rank的区别

都有对数据进行排序的功能

row_number():对相等的值不进行区分,相等的值对应的排名相同,序号从1到n连续

rank():相等的值排名相同,但若有相等的值,则序号从1到n不连续,若有两个人都排在第三名,则没有第4名

dense_rank():对相等的值排名相同,但序号从1到n连续,如果又两个人都排在第一名,则排在第2名(假设仅有1个第二名)的人是第3个人

十六、Hive导入数据的五种方式

1. Load方式,可以从本地或HDFS上导入,本地是copy,HDFS是移动

本地:load data local inpath ‘/root/student.txt’ into table student;
        HDFS:load data inpath ‘/user/hive/data/student.txt’ into table student;

2. Insert方式,往表里插入

insert into table student values(1,’zhanshan’);

3. As select方式,根据查询结果创建表并插入数据

create table if not exists stu1 as select id,name from student;

4. Location方式,创建表并指定数据的路径

create external if not exists stu2 like student location '/user/hive/warehouse/student/student.txt';

5. Import方式,先从hive上使用export导出在导入

import table stu3 from ‘/user/export/student’;

十七、Hive导出数据的五种方式

1. Insert方式,查询结果导出到本地或HDFS

Insert overwrite local directory ‘/root/insert/student’ select id,name from student;
        Insert overwrite directory ‘/user/ insert /student’ select id,name from student;

2. Hadoop命令导出本地

hive>dfs -get /user/hive/warehouse/student/ 000000_0  /root/hadoop/student.txt

3. hive Shell命令导出

$ bin/hive -e ‘select id,name from student;’  > /root/hadoop/student.txt

4. Export导出到HDFS

hive> export table student to ‘/user/export/student’;

5. Sqoop导出

十八、Hive 常用函数

coalesce:非空查找函数

collect_list:集合不去重函数

collect_set:集合去重数

concat_ws:带分隔符字符串连接函数(数组转换成字符串的函数)

substr、substring:字符串截取函数

str_to_map:字符串转换成 map 函数

regexp_replace:正则表达式替换函数

regexp_extract:正则表达式解析函数

get_json_object:json 解析函数

explode:数组拆分成多行、Map 拆分成多行

parse_url:URL 解析函数

from_unixtime:UNIX 时间戳转日期函数

unix_timestamp:日期转 UNIX 时间戳函数

date_add:日期增加函数

date_sub:日期减少函数

十九、星型模型和雪花模型区分

星形模式(Star Schema)是最常用的维度建模方式。星型模式是以事实表为中心,所有的维度表直接连接在事实表上,像星星一样。星形模式的维度建模由一个事实表和一组维表成,且具有以下特点:

a. 维表只和事实表关联,维表之间没有关联;

b. 每个维表主键为单列,且该主键放置在事实表中,作为两边连接的外键

c. 以事实表为核心,维表围绕核心呈星形分布

雪花模式(Snowflake Schema)是对星形模式的扩展。雪花模式的维度表可以拥有其他维度表的,虽然这种模型相比星型更规范一些,但是由于这种模型不太容易理解,维护成本比较高,而且性能方面需要关联多层维表,性能比星型模型要低。

星座模式是星型模式延伸而来,星型模式是基于一张事实表的,而星座模式是基于多张事实表的,而且共享维度信息。前面介绍的两种维度建模方法都是多维表对应单事实表,但在很多时候维度空间内的事实表不止一个,而一个维表也可能被多个事实表用到。在业务发展后期,绝大部分维度建模都采用的是星座模式。

HIVE 面试题总结相关推荐

  1. Hive面试题系列第三题-用户留存问题

    视频讲解地址:https://www.bilibili.com/video/BV1Rd4y1T7iU/?spm_id_from=333.788&vd_source=aa4fb0436f6d97 ...

  2. Hive面试题系列第七题-同时在线问题

    视频讲解地址: https://www.bilibili.com/video/BV1Tg411r7Jz/?spm_id_from=333.788&vd_source=aa4fb0436f6d9 ...

  3. Hive面试题—理清hive应用思路

    Hive面试题-理清hive应用思路 问题:有一张很大的表:TRLOG该表大概有2T左右. [sql] view plaincopy TRLOG: CREATE TABLE TRLOG (PLATFO ...

  4. HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数

    HIVE面试题原理详解 统计用户连续交易的总额.连续登陆天数.连续登陆开始和结束时间.间隔天数 友情提示 创建数据表 添加数据 流程图 第一步分析(子表a) 第二步分析(子表b) 第三步分析(子表c) ...

  5. hive 删除分区_数据仓库工具hive面试题集锦(纯干货)

    进入DATE时代,大数据技术成为互联网发展的核心要素之一.与此同时大数据开发工程师的薪资也成为行业内高薪的代表.想从事大数据开发需要掌握多种核心技术:Hadoop.Hive.Storm.Spark.S ...

  6. hive面试题总结(2020最新版)

    本文目录 一.hive架构相关 二.hive的特点 三.内部表和外部表的区别? 四.4个by的区别? 五.介绍一下有哪些常用函数? 5.1.行转列函数 5.2.列转行函数 5.3.Rank排名函数 5 ...

  7. Hive -- Hive面试题及答案(3)

    向导 小打卡面试题 题目一:计算小打卡平台的圈主建了多少圈子,名下有多少用户 题目二:处理产品版本号 题目三.计算平台用户留存 小打卡面试题 题目一:计算小打卡平台的圈主建了多少圈子,名下有多少用户 ...

  8. Hive面试题精选-2021

    文章目录 一,Hive是什么,和DBMS有什么异同? 二,sort by.order by.partition by.cluster by有什么区别 三,解释`select a.* from t1 a ...

  9. 大数据面试(一):Hive面试题

    面试题01. 请说下Hive和数据库的区别 Hive 和数据库除了拥有类似的查询语言,再无类似之处. 1)数据存储位置 Hive 存储在 HDFS .数据库将数据保存在块设备或者本地文件系统中. 2) ...

  10. hive相对于oracle的优点,【Hive】Hive面试题

    1.hive的join有几种方式,怎么实现join的? left join --以左表为基准,不符合的值以null值显示 --工作中以left join 居多,大表加载小表的形式 select emp ...

最新文章

  1. [JS] HEX颜色转换成RGBA
  2. Nmap/Netcat/Hping3工具对比
  3. 时装搭配_时装搭配修身T恤搭配紧身牛仔裤,时尚的穿搭,尽显时尚领导者
  4. Android内置第三方输入法
  5. AndroidStudio中提示:Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:
  6. [MySQL]MySQL分区与传统的分库分表(精华)
  7. The Pilots Brothers' refrigerator - poj 2965
  8. 都说不要装箱,那装箱到底带来了什么开销?
  9. Android -- 图片画画板(canvas、paint、bitmap)
  10. git简单使用(二)---远程仓库的建立与远程库的克隆
  11. javascript 近乎神话般的概念:闭包
  12. [转]C#操作注册表
  13. Faster R-CNN算法
  14. 如何在VS中统计项目代码量
  15. 引用阿里图标库(iconFont)的三种方式
  16. python 解析 google Chrome 浏览器历史浏览记录以及收藏夹数据
  17. Jenkins集成动态salve报错 连接测试报错:
  18. 2022 CCF中国软件大会(CCF Chinasoft)“软件智能合成理论与方法”论坛成功召开...
  19. 用python画皇冠_【推荐】手把手教你如何用Python画一棵漂亮樱花树含源码
  20. 重温经典 15年IE浏览器大盘点

热门文章

  1. ccrpipa6.ocx 和mswinsck.ocx 等文件缺失问题解决(用于TCP调试助手)
  2. 中国移动互联网行业深度报告
  3. MATLAB —— 散点图绘制
  4. linux-LNMP一键安装Error: MySQL install failed. Error: PHP install failed
  5. Magisk Magisk Manager 下载
  6. 太强了 GitHub中文开源项目榜单出炉,暴露了程序员的硬性需求
  7. 小程序php上传图片到服务器,关于微信小程序上传图片到服务器的代码
  8. protoc ——protubuf编译后的可执行文件命令usage
  9. STM32之红外接收
  10. C#二次开发金橙子MarkEzd.dll激光打标机