代码改变世界

大数据HIve视频教程全集笔记

2021-08-06 11:15  cascle  阅读(190)  评论(0编辑  收藏  举报

一.课程介绍

分十一章

  • 基本概念
  • 安装
  • 数据类型
  • DDL,数据定义
  • DML,数据操作
  • 查询
  • 函数
  • 压缩和存储
  • 调优
  • 实战谷粒影音
  • 常见错误及解决方案

 

二.基本概念

 Hive是个翻译引擎,仅存在于客户端,计算集群中不存在。

Hive无法支持迭代计算,数据挖掘不擅长

 

三.安装

Hive配置文件:conf/hive-env.sh.template,改为sh脚本再执行。要改hadoop文件位置和hive配置文件夹内容

 

use 《数据库》;

show tables;

create tables student(id int, name sring);

insert into student  values(2, "sq");

desc student;

quit;

load data local inpath  "/pata/data.txt" into table student;

drop table student;

create tables student(id int, name sring) row format delimited fields terminated by "\t";

 

hive默认只有单一用户数据库

 

Mysql无主机登录:mysql数据库里user表;select User,Host,Password from user;update user set host='%' where host='localhost';delete from user where Host=;hadoop102';flush privilleges;

 

配置Hive MetaStore数据放Mysql里:1.拷贝mysql驱动到hive/lib下;2.conf/hive-site.xml配置;3.会在mysql里创建metastore数据库(可配置);

-e:sql在字符串里;-f:sql在文件里

exit:先提交再退出

quit:直接退出,但是新版的无区别了

dfs ls /;

! ls /;

历史命令在家目录下的.hivehistory中

 

hive-site.xml里可以配置当前数据库名称和表结构名称,hive.cli.print.header和hive.cli.print.current.db

数据仓库位置:hive.metastore.warehouse.dir里配置

日志默认都在logs文件下,hive-log4j.properties,配置hive.log.dir

 

修改配置:全局修改;命令行用-hiveconf配置键值对;终端中用set命令设置

set 键值,查看值

 

四.数据类型

hive数据类型大写

复合数据类型:STRUCT,MAP,ARRAY

CAST('1' as INT);把字符串1转换为INT

 

五.DDL

创建数据库:create database 《》;,默认文件夹路径在/usr/hive/warehouse/*.db

location后可以指定路径

if not exists不存在时执行

查询数据库:show databases;

模糊查询:show databases like 'hive#';

查询详情:desc database <数据库>;

extended查看额外信息

alter database  《数据库》 set dbproperties (”a“="b");

删除数据库:drop database 《数据库》;数据库不为空删不掉,最后要加cascade

 

创建表:CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type) [COMMNET col_commnet],...]……

 

要用JDBC连接Hive的话,要开hiverserver2服务;Beeline可以模拟JDBC连接Hive;

 

管理表:也叫内部表,表没了数据也没了

create table as 

create table like

desc formatted <数据表>:查看表结构

内部表用来存中间结果和结果表,外部表存原始数据

内部表和外部表互相转换:alte table student2 set tlproperties(‘EXTERNAL'='FALAE');区分大小写和引号模式

 

partition就是建立一个单独的文件夹,大的数据集分为小的数据集,就是分目录,可以避免全表扫描

数据导入Hive时要指定分区,partition(分区名=’‘),指定分区列

alter table student add partition(分区名='');添加多个分区用空格分离

add改为drop即删除分区,删除多个partition用逗号分离

 

二级分区表:两个分区字段

 

分区表和数据产生关联的三种方式:

1.上传数据后修复:msck repair table 表名;

2.上传数据后添加分区

3.上传数据后load到分区

 

show partitions 表名;显示分区

 

修改表:

1.重命名:ALTER TABLE 名字 RENAME TO 新名

2.增加、修改、删除表分区

3.增加、修改、替换列信息:ALTER TABLE 表名 CHANGE  COLUME 列旧名 列新名 列类型 ,change可为add和replace,replace是替换所有字段

 

六.DML

load加载数据

本地是复制导入,hdfs是移动导入;

 

insert插入数据:可以把select的中间表查询结果插入;可以有多插入模式,多行来自一个表可以放在开头;

as  select方式创建表

 

创建表时通过location关键字指定数据位置来加载

 

import来导入export的数据

 

导出:

insert,导出到文件夹

hadoop dfs -get导出

hive shell输出重定向

export table 表明 to 路径,命令

 

清空表数据:truncate tabel 表名

 

 hive可以导入任意格式的数据,只要数据可以被格式化可以被理解

 

七.查询

Hive的cwiki上有LanguageManual,可看select部分

 

列重命名:可以用as分隔也可以不用

 

join只能等值连接,内连接 left right full连接

 

order by,一个全局reducer,默认升序

 

sort by,局部reducer

属性mapreduce.job.reduces决定有几个reducer job,默认-1;

 

distribute by

类似hadoop分区,结合sort by使用,按照字段分配给不同reducer,使其将结果存在不同的文件中

 

cluster by

sort by和distribute by是一个字段

 

分桶表:一个文件夹内数据按文件存储而不是按文件夹,应对数据集过大,语法是clustered by;

分桶表用insert模式建立;

hive.enforce.bucketing为true;

reduce数量要hive自己决定; 

这个就是hadoop里的分区

 

分桶抽样:

tablesample(bucket 1 out of 4 on id)

x为从哪个bucket出,y为bucket的几分之几

 

八.函数

给null赋值:nvl,列如果是null,则返回replace值

 

case when:case 字段 when 数值 then 数值 else 数值 end

 

行转列:

所谓的行转列是指把数据表中具有相同key值的多行value数据,转换为使用一个key值的多列数据,使每一行数据中,一个key对应多个value。

行转列完成后,在视觉上的效果就是:表中的总行数减少了,但是列数增加了。

concat:连接字符

concat_ws:用分隔符连接字符,参数的列只能是字符类型或者string类型数组

collect_set:将某列数据去重,返回数组

 

select 
    t1.c_b,
    CONCAT_WS("|", COLLECT_SET(t1.name))
from (
    select
        CONCAT_WS(",", constellation, blood_type) c_b, 
        name
    from person_info) t1
group by
t1.c_b

 

列转行:

所谓的列转行是指把表中同一个key值对应的多个value列,转换为多行数据,使每一行数据中,保证一个key只对应一个value。

列转行完成之后,在视觉上的效果就是:表中的列数减少了,但是行数增加了。

explode:将一列中的map、array分为多行

lateral view udtf(expression) tableAlias as columnAlias,和explode、split等合用,用于拆分后的聚合

对原来的行进行侧写

select movie, category_name
from movei_info lateral view explode(category) tmpTable as category_name;

 

窗口函数:

指定窗口,聚合函数应用窗口范围内数据进行计算

聚合函数,要是同时选区列,没有group by无法选择

跟在聚合函数后面,空格分离

只限定聚合函数

函数over():指定分析函数的窗口大小,不加参数即group by生成的组有几个。可以包含distribute by,按照某个字段分区来生成窗口

窗口限定了数据集合,每行数据按照属性进入不同的窗口中去

current row:当前行

n preceding:往前n行

n following:往后n行

unbounded:起点。unbounded preceding表示从前面的起点,unbounded following表示到后面的终点。

函数lag(col,n):往前第n行数据,可以指定窗口后接over函数

函数lead(col,n):往后第n行

函数ntile(n):有序分区中的行分发到指定数据的组中,各个组有编号,从1开始。ntitle返回的是组号。算百分比

 

rank:排名,有三个函数

rank:允许重复。直接over()因为没指定排序规则所有排行都一样

dense_rank:不允许重复

row_number:给出行号

 

partition by跟着order by

distributed by跟着sort by

 

函数:

show functions显示所有函数

desc function 描述函数

desc function extended 描述详细用法

 

自定义函数:

udf:

udaf:

udtf:

要继承UDF类,实现evaluate函数

使用add jar命令添加jar包或者用create [temporary] function创建函数

 

九.压缩和存储;

hadoop checknative检查本地可用

要支持snappy,把支持版本的lib/native里的库全都靠背就行

 

压缩编码:

 

 

 

 

mr中压缩参数配置:

 

 

 

 

hive中压缩配置:

set hive.exec.compress.intermediate=true;

set mapreduce.map.output.compress=true;

set mapreduce.map.output.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;

 

set hive.exec.compress.output=true;

set mapreduce.output.fileoutputformat.compress=true;

set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

set mapreduce.output.fileoutputformat.comptess.type=BLOCK;

 

snappy最优

 

存储格式:行和列。textfile,sequencefile,orc,parquet 

where适用于行,select适用于列

orc和parquet是列,textfile和sequencefile是行

 

orc存储率和查询效率最佳

 

创建压缩格式和存储格式可以在建表时指定

 

十.调优

fetch抓取:一些操作不走map reduce。范围可用hive.fetch.task.conversion控制

 

本地模式:不用yarn调度,属性hive.exec.mode.local.auto控制开关,hive.exce.mode.local.inputbytes.max控制多少阈值转为yarn,hive.exce.mode.local.auto.input.files.max控制文件阈值

 

小表join大表:减少内存溢出概率,小表数据先进内存。hive有优化,顺序无所谓

 

空key处理:过滤掉或者转换为其他值。不然可能产生数据倾斜

 

MapJoin:避免reducer阶段处理join。设置hive.auto.convert.join属性,小表阈值用hive.mapjoin.smalltable.filesize设置

 

 

GroupBy:在map阶段进行聚合操作。

属性hive.map.aggr判断是否开启;hive.groupby.mapaggr.checkinterval设置聚合数目;hive.groupby.skewindata设置是否在有数据倾斜的时候负载均衡

 

 

去重统计:count(distinct)用先group by再count替代。本质是数据交给多个reduce来处理

 

行列过滤:只拿需要的列;使用外关联时,如果把副表的过滤条件写在where后面,先全表关联再过滤

谓词下推:先走where字句再走select子句

所以先写子查询,where过滤了以后再join

 

动态分区:插入数据的时候不指定字段进行静态分区,跑MR的时候动态设置分区,用字段代替具体的值

hive.exec.dynamic.partition控制开关

hive.exec.dynamic.partitions设置所有执行MR节点上动态分区最大值

hive.exec.max.dynamic.partitions.pernode设置每个执行MR的节点上动态分区最大值

hive.exec.max.created.files在整个MR job中,最多可以创建多少个HDFS文件

hive.error.on.empty.partition指定空分区生成是否要抛异常

 

数据倾斜:合理设置map数量。会根据input的大小、数量、文件块大小设定map数目。

一个是小文件太多,一个是条数太多,要尽量设置多个map来处理

小文件合并,hive.input.format指定

大文件要增加map数量,调整切片大小,设置mapreduce.input.fileinputformat.split.maxsize属性,注意联动设置map reduce数量

 

设置reduce数量

hive.exec.reducers.bytes.per.reducer设置处理的默认数据量

hive.exec.reducers.max设置最大recude数

计算reducer数公式:N=min(参数2,总输入量/参数1)

属性mapreduce.job.reduces也可以设置reduce数,优先级别更高

有几个reduce,生成几个文件

 

并行执行:多个job并行执行。属性hive.exec.paralled开启,hive.exec.parallel.thread.number控制数量

 

严格模式:防止执行不好的查询。属性hive.mapred.mode控制

 

JVM重用:属性mapreduce.job.jvm.numtasks控制jvm数量

 

推测执行&压缩:属性mapreduce.map.speculative和mapreduce.reduce.speculative控制推测执行开关,推测多久完成

 

Explain:explain查看sql执行情况

 

十一.实战

 

十二.常见错误