HIVE

Hive源数据默认存储在derby数据库中,不支持多客户端访问,所以需要将源数据存储在Mysql中,才支持多客户端访问。主要架构如下:

HIVE

 

 

HIVE解析成MR的过程:

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

2.Hive与传统数据库的区别

Hive和数据库除了用户类型的查询语言外,无其他相似

  1.存储位置:Hive数据是存储在HDFS上。数据库保存在块设备或本地文件系统

  2.数据更新:Hive不建议对数据改写。数据库通常需要经常修改

  3.执行引擎:Hive通过MapReduce来实现。数据库用自己的执行引擎

  4.执行速度:Hive执行延迟高,但它数据规模远超过数据库处理能力时,Hive的并行计算能力就体现了优势,数据库执行延迟较低

  5.数据规模:Hive大规模的数据计算,数据库能支持的数据规模较小

  6.扩展性:Hive建立在Hadoop上,随Hadoop的扩展性。数据库由于ACID语义的严格限制,扩展有限

    A(atomicity)原子性:事务操作要么全部做完,要么不做。

    C(consistency)一致性:事务运行期间,数据对象依然完整性

    I(isolation)独立性:并发事务之间不会相互影响

    D(druability)持久性:一旦事务提交后,修改将永久保存在数据库上

3.Hive内部表和外部表的区别

  1.存储:外部表数据又HDFS管理;内部表数据又Hive自身管理

  2.存储:外部表数据存储位置由自己指定(没有指定lication则在默认地址下新建);内部表数据存储在hive.metastore.warehouse.dir(默认在/usr/hive/warehouse)

  3.创建:被external修饰的就是外部表;没被修饰的是内部表

  4.删除:删除外部表仅仅删除元数据;删除内部表会删除元数据和存储数据

4.Hive中order by,sort by ,distribute by 和cluster by的区别

  1.order by :对数据进行全局排序,只有一个reduce工作

  2.sort by:每个mapreduce中进行排序,一般和distribute by使用,且distribute by写在sort by前面,当mapred.reduce.tasks=1时,效果和order by一样

  3.distribute by:类似MR的Partition,对key进行分区,结合sort by实现分区排序

  4.cluster by:当distribute by和sort by的字段相同时,可以使用cluster by代替,但cluster by只能是升序,不能指定排序规则

  注意:在生产环境中order by使用的少,容易造成内存溢出(OOM)

     生产环境中distribute by 和sort by用的多

5.row_number(),rank()和dense_rank()的区别

  row_number():根据查询结果的顺序计算排序,多用于分页查询

  rank():排序相同时序号重复,总序数不变

  dense_rank():排序相同的序号重复时,总序数减少

select name,subject,score
       row_number() over(partition by subject order by score desc) rn,
       rank() over(partition by subject order by score desc) r,
       dense_rank() over(partition by subject order by score desc) dr
from student_score;

HIVE

 

 

6.Hive中常用的系统函数

  1.date_add(str,n),date_sub(str,n) 加减时间

  2.next_day(to_date(str,‘MO‘) 周指标相关,获取str下周一日期

  3.date_format*=(str,‘yyyy‘) 根据格式整理日期

  4.last_day(to_date(str)) 求当月最后一天日期

  5.collect_set(col)收集数据返回一个以逗号分隔的字符串数组

  6.get_json_object(jsonstr,;$.object‘) 解析json,使用 $.object获取对象值

  7.NVL(str,replace) 空字段赋值,str为空返回replace值;两个都为空则返回null

7.Hive如何实现分区

  1.建表:create tbale tablename(col1 string) partitioned  by (col2 string);

  2.添加分区:alter table tablename add partition(col2=‘202101‘)

  3.删除分区:alter table tablename drop partition(col2=‘202101‘)

8.Hive导入数据的五种方式

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

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

  HDFS:load data inpath ‘/usr/hive/data/student.txt‘ into table student;

  2.insert:往表里插入

  insert into table student values(1,‘zhangsan‘);

  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 lication ‘/usr/hive/warehouse/student/student.txt‘;

  5.import,先从hive上使用export导出再导入

  import table stu3 from /usr/export/student‘

9.Hive导出数据的五种方式

  1.insert 查询结果导出到本地或HDFS

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

  insert overwrite directory ‘/usr/insert/student‘ select id, name from student;

  2.hadoop命令导出本地

  hive> dfs -get /usr/hive/warehouse/student/00000_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 ‘/usr/export/student‘;

  5.Sqoop导出

10.自定义UDF,UDTF函数

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

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

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

Hive自定义函数包括三种UDF、UDAF、UDTF

  UDF(User-Defined-Function) 一进一出

  UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min

  UDTF(User-Defined Table-Generating Functions)  一进多出,如lateral view explore()

  使用方式 :在HIVE会话中add 自定义函数的jar文件,然后创建function继而使用函数

 

HIVE

上一篇:关于时间常用的一些函数的封装


下一篇:CAD如何使用倒角命令