欢迎投稿

今日深度:

Hive初级,

Hive初级,


Hive的内置函数和基本的UDF函数

1.内置函数

在Hive中给我们内置了很多函数官方地址
也可以在启动hive后输入命令查看函数:

SHOW FUNCTIONS;
DESCRIBE FUNCTION <function_name>;
DESCRIBE FUNCTION EXTENDED <function_name>;

查看所有的内置函数

hive> show functions;
OK
!
!=
%
&
*
+
-
/
<
<=
<=>
<>
=
.......
xpath_number
xpath_short
xpath_string
year
|
~
Time taken: 0.503 seconds, Fetched: 216 row(s)

由上图我们可以看到 Hive的内置函数共有216个函数。函数众多,这里就不一一列举,具体函数应用 初看函数名 然后在日常开发灵活应用。

查看某个函数的具体语法

hive> DESCRIBE FUNCTION case;
OK
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END - When a = b, returns c; when a = d, return e; else return f

hive> DESCRIBE FUNCTION EXTENDED case;

hive> DESCRIBE FUNCTION EXTENDED case;
OK
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END - When a = b, returns c; when a = d, return e; else return f
Example:
 SELECT
 CASE deptno
   WHEN 1 THEN Engineering
   WHEN 2 THEN Finance
   ELSE admin
 END,
 CASE zone
   WHEN 7 THEN Americas
   ELSE Asia-Pac
 END
 FROM emp_de
tails

2.Hive自定义函数UDF

Hive中的内置函数,比较简单,用到的时候可以在官网进行查询,虽然有很多内置的函数,但是生产上肯定不够那么全面,所有,用户需要自定义函数来满足自身的求

  • 自定义函数开发UDF(官方网址):

详细操作,包括代码编写用户自定义的函数UDF 打包jar包 创建临时函数或者永久函数等。可参考官网 或者Hive的内置函数和自定义函数UDF

3.UDF UDAF UDTF

我们知道Hive的SQL还可以通过用户定义的函数(UDF),用户定义的聚合(UDAF)和用户定义的表函数(UDTF)进行扩展。

当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
  
UDF(User-Defined-Function) 一进一出

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

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

Hive和关系型数据库的区别(重点)

  • Hive时效性、延时性比较高,可扩展性高;
  • Hive数据规模大,优势在于处理大数据集,对于小数据集没有优势
  • Hive中insert/update没什么实际用途,大数据场景下大多数是select
  • RDBMS也支持分布式,节点有限 成本高,处理的数据量小
  • Hadoop集群规模更大 部署在廉价机器上,处理的数据量大
  • 数据库可以用在Online的应用中,Hive主要进行离线的大数据分析;
  • 数据库的查询语句为SQL,Hive的查询语句为HQL(南国觉得这二者本质上并没有什么区别);
  • 数据库数据存储在LocalFS,Hive的数据存储在HDFS;
  • 数据格式:Hive中有多种存储格式:由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,
    因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。
    而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,
    数据库加载数据的过程会比较耗时。
  • Hive执行MapReduce,MySQL执行Executor(这也是最重要的区别);

Hive的优点

1.统一的元数据管理 metastore包括的了数据库,表,字段分区等详细信息
2.由于统一的元数据管理所以和spark/impala等SQL引擎是通用的
通用是指,在拥有了统一的metastore之后,在Hive中创建一张表,在Spark/impala中是能用的,反之在Spark中创建一张表,
在Hive中也能用;只需要共用元数据,就可以切换SQL引擎
涉及到了Spark sql 和Hive On Spark(实验版本)
3.使用SQL语法,提供快速开发的能力,支持自定义函数UDF。
4.避免了去写mapreduce,减少开发人员学习成本。
5.数据离线处理,比如日志分析,海量数据结构化分析

MapReduce实现基本SQL操作的原理(核心中的核心)

这一部分的摘选自美团技术团队的技术总结,干货非常多。

SQL转化为MapReduce的过程(非常重要!!!)
了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:

  • Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
  • 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
  • 遍历QueryBlock,翻译为执行操作树OperatorTree
  • 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
  • 遍历OperatorTree,翻译为MapReduce任务
  • 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

问题来了,那么请问是所有的Hive QL都会走MapReduce执行过程吗??
答案:不是,早期版本的hive 为了执行效率考虑,简单的查询,就是只是select,不带count,sum,group by这样的,都不走map/reduce,直接读取hdfs文件进行filter过滤。

这样做的好处就是不新开mr任务,执行效率要提高不少,但是不好的地方就是用户界面不友好,有时候数据量大还是要等很长时间,但是又没有任何返回。

改这个很简单,在hive-site.xml里面有个配置参数叫
hive.fetch.task.conversion
将这个参数设置为more,简单查询就不走map/reduce了,设置为minimal,就任何简单select都会走map/reduce

Create Table As Select (CTAS) 走mr
create table emp2 as select * from emp;

insert一条或者多条 走mr

Hive静态分区动态分区

关于分区,其实我在上一篇博客里面Hive入门已经讲过了,这里再做一个小结和概括。
1.分区的概念
Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应HDFS上的一个目录名,子分区名就是子目录名,并不是一个实际字段。

2.分区的好处
产生背景:如果一个表中数据很多,我们查询时就很慢,耗费大量时间,如果要查询其中部分数据该怎么办呢,这是我们引入分区的概念。
Partition:分区,每张表中可以加入一个分区或者多个,方便查询,提高效率;并且HDFS上会有对应的分区目录:

3.语法:
Hive分区是在创建表的时候用Partitioned by 关键字定义的,但要注意,Partitioned by子句中定义的列是表中正式的列,
但是Hive下的数据文件中并不包含这些列,因为它们是目录名,真正的数据在分区目录下。

4.静态分区和 动态分区的区别
创建表的语法都一样

  • 静态分区:加载数据的时候要指定分区的值(key=value),比较麻烦的是每次插入数据都要指定分区的值,创建多个分区多分区一样,以逗号分隔。
  • 动态分区:
    如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个load data,太烦人。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
首先,启动动态分区功能

hive> set hive.exec.dynamic.partition=true;

采用动态方式加载数据到目标表 
加载之前先设置一下下面的参数

hive (default)> set hive.exec.dynamic.partition.mode=nonstrict
1
开始加载

insert into table emp_dynamic_partition partition(deptno)
select empno , ename , job , mgr , hiredate , sal , comm, deptno from emp;

加载数据方式并没有指定具体的分区,只是指出了分区字段。
在select最后一个字段必须跟你的分区字段,这样就会自行根据deptno的value来分区。

5.删除分区:
ALTER TABLE my_partition_test_table DROP IF EXISTS PARTITION (day=‘2018-08-08’);

参考资料:
美团技术团队-Hive SQL的编译过程
Hive总结篇及Hive的优化

www.htsjk.Com true http://www.htsjk.com/hive/40153.html NewsArticle Hive初级, Hive的内置函数和基本的UDF函数 1.内置函数 在Hive中给我们内置了很多函数官方地址 也可以在启动hive后输入命令查看函数: SHOW FUNCTIONS;DESCRIBE FUNCTION function_name;DESCRIBE FUNCTION...
相关文章
    暂无相关文章
评论暂时关闭