【SerDe】
–用于做序列化和反序列化
–构建在数据存储和执行引擎之间,对两者实现解耦

【Beeline】
–要与HiveServer2配合使用
–服务端启动hiveserver2
–客户端通过beeline两种方式连接到hive
–beeline -u jdbc:hive2://localhost:10000/default -n root
–beeline
beeline>!connect jdbc:hive2://:/;auth=no Saslroot123
–默认用户名、密码不验证

【jdbc】
–服务端启动hiveserver2后,在java代码中通过调用hive的jdbc访问默认端口10000进行连接访问

【函数】
UDF(user-Defined-Function)一进一出
UDAF(user-Defined Aggregation Funcation) 聚集函数,多进一出
UDTF(user-Defined Table-Generating Function) 一进多出

自定义函数:
–编写方式:继承org.apache.hadoop.hive.ql.UDF,实现evaluate函数,evaluate函数支持重载
–使用方式:在HIve会话中add自定义函数的jar文件,然后创建function继而使用函数
–hive>add jar /run/jar/udf_test.jar;
–创建临时函数:create temporary function add_example as ‘hive.udf.Add’;

–explode(array):数组一条记录中有多个参数,将参数拆分,每个参数生成一列
hive实现wordcount:
select count(explode(split(word,’ '))) from wc;

【参数和动态分区】
–hive中的参数、变量,都是以命名空间开头的
命名空间 读写权限 含义
hiveconf 可读写 hive-site.xml中的各种配置变量
system 可读写 系统变量,包含jvm运行参数
env 只读 环境变量
hivevar 可读写 例:hive-d val=key
–通过${}方式进行引用,其中system、env下的变量必须以前缀开头
–hive --hiveconf hive.cli.print.header=true
–set hive.cli.print.header=true;

–开启动态分区:
–set hive.exec.dynamic.partition=true;
–set hive.exec.dynamic.partition.mode=nostrict;
默认strict,至少有一个分区是静态分区
–相关参数;
–set hive.exec.max.dynamic.partitions.pernode;
每一个执行mr节点上,允许创建的动态分区的最大数量(100)
–set hive.exec.max.dynamic.partitions;
所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
–set hive.exec.max.created.files;
所有的mr job允许创建的文件的最大数量(100000)
–from table_name
insert overwrite table table_name partition(col1,col2,…)
select col,col,col,col1,col2 distribute by col1,col2;

【分桶】
–分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储
–对于hive中每一个表,分区都可以进一步进行分桶
–由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中
–数据抽样、map-join
–开启支持分桶:
–set hive.enforce.bucketing=true;
默认false,设置为true后,mr运行时会根据bucket的个数自动分配reduce task个数
一次作业产生的桶(文件数量)和reduce task个数一致
–创建分桶表:

create table table_name(cols)
    clustered by(col) into num buckets
    row format delimited fields terminated by ',';

–往分桶表加载数据
–insert into table bucket_table select cols from fbl;
–insert overwrite table bucket_table select cols from tbl;

–桶表抽样:
TABLESAMPLE语法:
–tablesample(bucket x out of y)
–x:从哪个bucket开始抽取数据
–y:必须为该表总bucket数的倍数或因子
–桶个数/y=总数据份数
–select * from bucket_table tablesample(bucket 1 out of 4 on cols);

【Hive Lateral View、Hive视图、Hive索引】
–hive lateral view
–用于和UDTF函数(explode、split)结合使用
–首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表
–主要解决在select使用UDTF做查询过程中,查询只能包含单个UDTF,不能包含其他字段,以及多个UDTF的问题

–语法:lateral view udtf(expression) 表别名 as 列别名

–hive视图:
–和关系型数据库中的普通视图一样
–特点:
–不支持物化视图
–只能查询,不能做加载数据操作
–视图的创建,只是保存一份元数据,查询视图时才执行对应的子查询
–view定义中若包含了order by limit语句,当查询视图时也进行order by limit语句操作,view当中定义的优先级更高
–view支持迭代视图

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT ...;

–hive索引:
–优化查询以及检索性能

CREATE INDEX index_name
  ON TABLE base_table_name (col_name, ...)
  AS index_type //指定索引器
  [WITH DEFERRED REBUILD]
  [IDXPROPERTIES (property_name=property_value, ...)]
  [IN TABLE index_table_name] //指定索引表
  [
     [ ROW FORMAT ...] STORED AS ...
     | STORED BY ...
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (...)]
  [COMMENT "index comment"];


DROP INDEX [IF EXISTS] index_name ON table_name;


ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

【hive运行方式、hiveGUI接口、hive权限管理】
–hive运行方式:
–命令行cli:控制台模式
–与hdfs交互
–执行hdfs命令:fs -ls /
–与linux交互
–!开头:!pwd
–脚本运行方式(实际生产使用)
–hive -e “”
–hive -e “” > aaa 追加
–hive -S -e “” > aaa 静默输出
–hive -f file 执行文件中的HQL
–hive -i /home/my/hive-init.sql 执行文件并进入客户端
–hive>source file 客户端中执行文件
–JDBC:hiveserver2
–web GUI
–hive权限管理:
Privileges
● SELECT privilege – gives read access to an object.
● INSERT privilege – gives ability to add data to an object (table).
● UPDATE privilege – gives ability to run update queries on an object (table).
● DELETE privilege – gives ability to delete data in an object (table).
● ALL PRIVILEGES – gives all privileges (gets translated into all the above privileges).

–三种授权模型:
–Storage Based Authorization in the Metastore Server
基于存储的授权,可以对Metastore中的元数据进行保护,但是没有提供更加细粒度的访问控制(例如列级别,行级别)
–SQL Standards Based Authorization in HiveServer2
基于SQL标准的HIve授权,完全兼容SQL的授权模型,推荐使用该模式
除了支持对用户的授权支持,还支持对角色role的授权认证
–role可以理解为一组权限的集合,通过role为用户授权
–一个用户可以具有一个或多个角色
–默认包含:public、admin
CREATE ROLE role_name;

DROP ROLE role_name;

SHOW CURRENT ROLES;

SET ROLE (role_name|ALL|NONE);

GRANT role_name [, role_name] …
TO principal_specification [, principal_specification] …
[ WITH ADMIN OPTION ];
principal_specification
: USER user
| ROLE role

REVOKE [ADMIN OPTION FOR] role_name [, role_name] …
FROM principal_specification [, principal_specification] … ;
principal_specification
: USER user
| ROLE role

–Default Hive Authorization(Legacy Mode)
Hive默认授权-设计目的仅仅只是为了防止用户产生误操作,而不是防止恶意用户访问未经授权的数据

【hive优化】
–把Hive SQL当作MapReduce程序去优化
–以下SQL不会转化为MapReduce
–select仅查询本表字段
–where仅对本表字段做条件过滤
–Explain显示执行计划
–Explain【EXTENDED】query

–Hive运行方式:
–本地模式
开启:set hive.exec.mode.local.auto=true;
hive.exec.mode.local.auto.inputbytes.max默认128M
表示加载文件的最大值,若大于该配置仍会以集群方式来运行
–集群模式

–并行计算:
开启:set hive.exec.parallel=true;
hive.exec.parallel.thread.number——一次SQL计算中允许并行执行的job个数的最大值

–严格模式:
开启:set hive.mapred.mode=strict——默认为nonstrict非严格模式
查询限制:
对于分区表,必须添加where对分区字段的条件过滤
order by语句必须包含limit限制输出
限制执行笛卡尔积的查询

–Hive排序
–order by 对于结果做全排序,只允许一个reduce做处理
数据量较大时,慎用,严格模式下需与结合limit使用
–sort by 对于单个reduce的数据进行排序
–distribute by 分区排序,经常和sort by结合使用
–cluster by 相当于sort by+distribute by
不能通过asc、desc指定排序规则
可通过distribute by column sort by column asc|desc的方式

–Hive Join
–Join计算时,将小表(驱动表)放在join的左边
–Map Join:在Map端完成Join
两种实现方式:
–SQL方式,在SQL语句中添加MapJoin标记
select /+MAPJOIN(smalltable)/ smalltable.key,bigtable.value
from smalltable Join bigtable on smalltable.key=bigtable.key;
–开启自动的MapJoin
set hive.auto.convert.join=true;
–该参数为true时,自动对左边的表统计量,如果是小表就加入内存,即对小表用MapJoin
相关配置;
hive.mapjoin.smalltable.filesize; 大小表判断的阈值,表的大小小于该值则会被加载到内存中运行
hive.ignore.mapjoin.hint; 默认值为true,是否忽略mapjoin标记
hive.auto.convert.join.noconditionaltask; 默认值为true,将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin
hive.auto.convert.join.noconditionaltask.size; 将多个mapjoin转化为一个mapjoin时,其表最大值

–Map-Side聚合
开启:set hive.map.aggr=true;
相关参数:
hive.groupby.mapaggr.checkinterval map端group by执行聚合时处理多少行数据 默认100000
hive.map.aggr.hash.min.reduction 进行聚合的最小比例(预先对100000条数据做聚合,若聚合之后的数据量/100000大于该配置0.5,则不会聚合)
hive.map.aggr.hash.percentmemory map端聚合使用的内存的最大值
hive.map.aggr.hash.force.flush.memory.threshold map端做聚合操作时hash表的最大可用内容,大于该值则会触发flush
hive.groupby.skewindata 是否对group by产生的数据倾斜做优化,默认false

–控制Hive中Map以及Reduce的数量
–Map数量相关参数
mapred.max.split.size 一个split的最大值,即每个map处理文件的最大值
mapred.min.split.size.per.node 一个节点上split的最小值
mapred.min.split.size.per.rack 一个机架上split的最小值

–Reduce数量相关参数
mapred.reduce.tasks 强制指定reduce任务数量
hive.exec.reducers.bytes.per.reducer 每个reduce任务处理的数据量
hive.exec.reducers.max 每个任务最大的reduce数

–Hive JVM重用
适用场景:
小文件个数过多
task个数过多
set mapred.job.reuse.jvm.num.tasks=n设置
缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,知道所有的task即整个job全部执行完成时,才会释放所有task插槽资源