hive理解文档

1、 Hive本质就是翻译器,通过写sql的形式写mapreduce,起到翻译的作用,写的是sql,翻译成mapreduce
2、 特点:慢,表达能力有限,适合处理大数据:决定hive主要处理数仓,数仓读多写少,重点在查。
3、 Hive调优比较困难,因为它翻译成mapreduce的过程我们无法干预,调优只能根据大体上的进行调优,无法细化。
4、 Hive基于hadoop,是hadoop的表现形式
5、 在这里插入图片描述
前面的结果作为后面的输入:xargs
6、 在这里插入图片描述
更改密码主机后刷新权限;
7、 hive是hadoop的封装,所以在hive客户端上可以执行dfs命令
在这里插入图片描述
也可以执行本地文件,前面加!
在这里插入图片描述
8、 命令:
(1) 启动hive:bin/hive
(2) 用jdbc连接hive
bin/hiveserver2bin/beeline!connect jdbc:hive2://hadoop102:10000用户密码
问:为什么(1)和(2)用的连接的步骤不相同
答:因为(1)是直接通过自己的客户端连接hive,而(2)是通过jdbc接口连接hive,详细的说(2)中用的是bin/beeline只启动了hive的后台服务,即下面的小方框中的内容,后面的命令是hive自带的cli和Driver。也就是说在只启动后台服务时,也可以使用其他的通过jdbc进行连接hive、
在这里插入图片描述
9、 hive自带的derby不支持多用户访问,所以我们用mysql来代替hive自带的数据库。要注意的是hive数据库中存储的是描述数据的元数据,不是真正的数据,真正的数据存放在hdfs中。类似于一张表的,表格中的数据存放在hdfs中,而表的表头,结构存放在hive的数据库中。
10、 内部表:管理表,表的数据归hive管。
外部表:hive不直接管理,通过外部映射的方式改变了数据的呈现形式。不是hive自己用,当和别的框架共享数据的时候,比如可能kafka也要用。(external)
内部表:本地导入:复制数据,hdfs导入:移动数据
外部表:本地导入:复制数据,hdfs导入:移动数据,
11、 在这里插入图片描述
12、 理解:
(1) 表的存储位置:load是将数据复制/移动到表格hdfs对应的文件夹下。
(2) 表的内外表装换:和改变表字段的操作是一致的。
13、 分区表:Hive没有索引,分区可以起到一点索引的作用
分区就是分文件夹存储。比如生成的log日志,每天的放在一个文件夹中。
新建表:
在这里插入图片描述
导入数据需要加分区:
在这里插入图片描述
增加和删除分区时,就像操作表的字段一样的语句就可以了。同样,hdfs中也会自动进行相应的文件夹的操作。但是相反,如果先添加文件夹,在查找分区是查不到的,因为元数据中没有新建文件夹的这个分区,这种情况下,我们可以采用下面任意的办法进行修复元数据。
(1) 在这里插入图片描述
(2) 直接添加分区
在这里插入图片描述
实际工作修复元数据情况:在hive中log表,而log文件中的数据不是我们采集的,是通过别的框架采集来放在这个文件夹下的,但此时我们hive中没有元数据,所以无法关联上,然后我们一般采用第一种方式修复元数据。
Hive是对hadoop的封装,是改变了数据的呈现形式,查找时,是从hive的元数据进行查找,所以只创建文件夹,不会更改元数据,所以查不到分区。
hive查看表时,就会多出month这个字段。
在hdfs中存储时,就多了一层目录,多了month表示的具体字段命名的目录。
好处就是:因为是按照月份进行分文件夹存储,所以在查找某个月的数据时,就不需要进行全表扫描了,直接查找时添加where=month就可以不进行全表扫描,只扫描这个文件夹中的数据。相应的,如果再细化分区,按照月份和日期进项划分,这样就可以通过相应的月份和日期进行不是全表扫面的操作,就相当于建立了索引,只不过粒度比较粗。
14、 HashMap:特点快,算法高效,基于HashTable
15、 Hive加载数据一般两种,一种as后跟查询其他表格数据。第二种load。注意:在load时hive是将数据复制到自己表格对应的文件夹下。
16、 创建删除表格和数据库时,尽量加上if not exists/if exists比较谨慎,加这个的目的是为了以后如果放在脚本中执行,语句不容易出错。
17、 Hive默认的分隔符:“\001”
18、 导入数据:如果是从hdfs中导入数据,是将文件剪切到相应的文件夹中。从本地导入数据,是复制。
19、 模拟数据已经存在,但是表没有,就在这个地方建立一张表,创建元数据。
在这里插入图片描述
20、 Hive只支持等值连接,是有mapreduce的特性决定的,就是只支持等号不支持大于号等符号。这个mapreduce特性是指如果连接两个表格,或者mapjoin或者reducejoin,无论是哪个join都是要key相等进行连接,所以只支持等值连接。
21、 Order by 全局排序很慢,排序分区只能区内有序,想要全局排序必须所有数据都在一个分区,即只有一个reducetask,那么这一个reducetask就会处理很多数据,也就进行的很慢。
22、 Sort by局部排序,即区内有序。这样既可以使用多个区,多个reducetask,会很快。但是没有指定分区规则。
23、 Distribute by 指定按照什么分区,即指定分区规则。如果只是sort by 并没有指定分区规则,加上这个可以指定分区规则。
24、 Cluster by 当distribute by 和 sort by 的字段相同时,可以用cluster by 代替,即按照这个字段分区,按照这个字段顺序进行排序。
25、 根据分区排序显示出来hive底层是mapreduce的结构,mysql中没有的特性。
26、 Mysql中join(只有join)后面一般写where因为可以使用索引(一般规律),而hive中join后面使用on,不能使用where。
27、 分桶:就是把数据分文件管理。分区是分文件夹管理。
分区和分桶的区别:也就是分区的依据字段在数据文件中没有,而分桶的依据字段在数据文件中是存在的。
创建分桶表直接load数据是不会分桶(分文件)的。从别的表select数据导入分桶表,数据如果仍然不能分桶,是因为数据太小了。
在这里插入图片描述
在执行select选择其他表的数据导入分桶表,就分桶了。因为select其他表中的数据时,过了mapreduce,文件才重新生成,才能分文件。
分桶就是分文件,所以必须1.经过mapreduce 2,。数据量足够大这两个条件满足。
对于hive来说,因为不是数据库,所以没有索引,分桶是进一步细化数据管理粒度的手段。
假设有十几亿条数据,想掌控这些数据,看数据,看大致模样,我们只需要知道数据的结构就可以了,不需要看全部数据,需要抽样调查的过程,如果没有分桶,我们就需要从这所有数据进行遍历才能抽的出来。如果分桶,我们可以从其中几个桶中抽取数据,就没有必要遍历所有数据。(一个分桶之所以可以代表整体数据,是因为分桶是根据hash进行分桶的,数据相对分配的比较分散)
有了分桶,就对数据有了整体的把握。

抽数据:将所有桶平均分Y个桶,取X个桶中的数据。,
分桶之后能干嘛?抽样
28、 NVL作用如果一列数据是double,此时没有数据时是NULL,以后统计时不方面,可以用一个-1.0这种异常数据代替NULL。
29、 Udtf函数:一进多出:explode
30、 函数:
(1) Concat(stirngA/col,stirngB/col)
(2) Concat_ws(separator,str1,str2……),是(1)的特殊形式,添加了分隔符
(3) Collect_set(col):与(1)(2)不同是,这个集合了一个字段中的数据,而(1)(2)是收集几个字段的数据
(4) Explode(col),这个与(3)相反,(3)是将集合这个字段的数据,而这个是将这个字段的数据分割开来。
(5) Lateral view udtf(expression) tableAlias columnAlias和udtf函数连用,将udtf函数生成的数据生成侧视图,转化为一列,和其他表格一起组成新的表格,相当于join,只不过join的形式是:其他表格 join 上面的语句;而这个是的形式:其他表格 上面的语句。这种形式就和新表格呈现出的形式是一样的,新表格是旧表格后面直接加上一列,语句也是直接加在旧表格表名后面,不需要任何修饰词。
31、 函数形式理解,之前没学hive之前,select a,count()……中·count()也是在表后面多了一个函数列,现在只不过是这个函数列的函数是我们自己定义而已。
32、 窗口函数的意义不是开的那一列,而是那一列中开几个窗口。每个窗口执行一个操作,每多一个窗口多一个mapreduce,除非开得窗是恰巧一样的,才只执行一个mapreduce,窗口函数得执行是表选完数据之后才执行。
33、在这里插入图片描述
这两天效果是一样的,都是根据name分区,并按照orderdate进行逐级累加
34、 Ntile(n)将有序分区中的数据在进行分组,分成n组,尽力每组平分数据。
35、 多一个窗就会多一个mapreduce,
hive执行顺序:
(1) 没有函数的select生成的表1
(2) 第一个窗口函数生成表2(表1+窗口函数1的列)操作:将表1当做整体进行函数操作。
(3) 第二个窗口函数生成表3(表2+窗口函数2的列)操作:将表2当做整体进行函数操作。
(4) 乱序原因:
36、 Maven依赖查找:
在这里插入图片描述
37、 Hadoop中lib下是本地库文件,hadoop是java语言写的之所以要编译,就是因为每个系统的lib下的本地库不同。
38、 在这里插入图片描述
前两个行存储,后两个列存储。工作基本都是列式存储,orc是mapreduce支持的比较好,parouet是spark支持的比较好。存储一般和压缩一起用,压缩一般用snappy。
在这里插入图片描述
为什么表格数据中不要写select * ?表格存储数据一般都是按列存储
如果采用列式存储,id和name很远,先1001,再xiaoli,再1002,再xiaoming
如果要是select id,name,则是先把id这一列查到,然后再把name这一列查到,放在一起。
综上select * 要查询实际查询的次数很多,而select id,name查询的次数比较少。
Orc/parquet存储也要经过mapreduce才能启动Orc/parquet存储,即要从别的表查询数据插入到orc表格中
在这里插入图片描述
39、 错误代码2:内存溢出。例如列式存储中(Orc/parquet格式的表格),采用select count(
) 进行统计时,有可能会内存溢出。如果溢出了,可以将hive的堆内存设置的大一点。工作中,用hive处理数据,用的mapreduce处理引擎,是用的orc格式处理的。
错误代码1:代码出错
40、 distinct会将全表数据放进一个reduce运行,就失去了分布式的作用,而且会很慢。
那如果数据量大的时候,要去重该用什么? Group by + 子查询。
在这里插入图片描述
41、 动态分区调整,将数据中包含的一列不要设置进创建表格的语句,将这一类指定为分区列。语句:
42、 如果map阶段很复杂,就减小每次处理的块大小。
43、 在这里插入图片描述
窗口函数,从形式上来看,虽然是在原表的后面添加了一列数据,但是总归不是原表格中的数据,所以要想对窗口函数中的值进行筛选,只能用子查询,不能直接在窗口函数得原语句中使用筛选,否则会报错。
44、 建立分桶表的时候要指定分几个桶,因为分桶是分文件,既然是分文件,就需要走mapreduce,走mapreduce,想要分几个文件,就需要指定reducetask的个数,reducetask有几个才会生成几个文件,这个桶的个数就像设定了reducetask的个数一样。
在这里插入图片描述

45、 Hive语句中注意事项
(1) 如果语句中有order by 那么在在select就要取order by 后面的字段,否则会报错、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值