赞
踩
⾸先客户端通过shell或者Beeline等⽅式向Hive提交SQL语句,之后sql在driver中经过
解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 ANTLR;对AST 进行语法分析,分析查询语法和查询计划,检查 SQL 语义是否有误。
编译器(Compiler):获取元数据,检查表是否存在、字段是否存在,然后将 AST 编译生成逻辑执行计划。
优化器(Query Optimizer):对逻辑执行计划进行优化。
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。最后根据优化后的物理执行计划生成底层代码进行执行,对于 Hive 来说,就是 MR/Spark。
最后将MR/SPARK任务提交到YARN上执⾏,执⾏成功返回结果。
UDF(普通函数,⼀进⼀出,可以⽤于字符串处理、⽇期处理)
第一种是比较简单的形式,继承 UDF 类通过 evaluate 方法实现,目前已过时。
第二种是继承 GenericUDF 重写 initialize 方法、evaluate 方法、getDisplayString 方法实现。
UDAF(聚合函数,多进⼀出,可以⽤于求平均值、求最⼤值、求最⼩值等场景)
实现 UDAF 的方式有两种:
第一种是比较简单的形式,先继承 UDAF 类,然后使用静态内部类实现 UDAFEvaluator 接口,目前已过时。
第二种是先继承 AbstractGenericUDAFResolver 类重写 getEvaluator 方法,然后使用静态内部类实现
GenericUDAFEvaluator 接口。
UDTF(表⽣成函数,⼀进多出,⽤于数据拆分、数据过滤等场景 )
实现 UDTF 需要继承的 GenericUDTF,然后重写⽗类的三个抽象⽅法( initialize , process ,close ),输出后有⼏列,在 initialize 中定义,主要处理逻 辑在 process 中实现。
将自定义 UDTF 程序打成 jar 包并上传至 HDFS。
在 Hive 中定义自定义函数。
重新加载函数。
Hive自定义函数的作用是为了解决系统内置函数无法满足实际业务需求的问题,开发者可以根据自身的业务需求编写函数来实现个性化的功能。
HIve的分区可以分为静态分区和动态分区。静态分区的规则需要⽤户⾃定义,动态分区由系统通过⽤户数据判断。
Hive分桶主要是采⽤对列值哈希,然后除以桶的个数求余的⽅式决定该条记录要存放在哪个桶中。
分区表分为静态分区和动态分区
静态分区是手动指定,而动态分区是通过数据来判断分区的。静态分区的列是在编译时期通过用户传递来决定的;动态分区只有在 SQL 执行时才能决定。
分区和分桶的区别主要有以下⼏点:
分区和分桶可以根据具体的业务需求进⾏选择:
分区和分桶的注意事项:
分区和分桶会增加数据存储的成本。
分区和分桶会影响数据的插⼊和删除操作。
1、数据存储位置。Hive是建立在Hadoop之上的,所有的Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或本地文件系统中。
2、数据格式。Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法。数据库中,存储引擎定义了自己的数据格式。所有数据都会按照一定的组织存储。
3、数据更新。Hive的内容是读多写少的,因此,不支持对数据的改写和删除,数据都在加载的时候中确定好的。数据库中的数据通常是需要经常进行修改。
4、执行延迟。Hive在查询数据的时候,需要扫描整个表(或分区),因此延迟较高,只有在处理大数据是才有优势。数据库在处理小数据是执行延迟较低。
5、索引。Hive没有,数据库有
6、执行。Hive是MapReduce,数据库是Executor
7、可扩展性。Hive高,数据库低
8、数据规模。Hive大,数据库小
物化视图和视图都是数据库中的数据对象,但它们的性质和⽤途有所不同:
总的来说,物化视图和视图的区别在于视图是⼀种虚拟表,不实际存储数据,物化视图是⼀种实际存储数据的表。视图适合处理动态数据集,物化视图适合处理静态数据集。
通过 SQL 操作
将查询结果导出到本地
将查询结果输出到 HDFS
1. 首先在 HDFS 上创建一个存储导出数据的目录。
2. 查询结果导出到 HDFS
3. 导出到hdfs文件系统,只需要将 local 关键字去除即可
通过 HDFS 操作
首先在 HDFS 上创建一个存储导出数据的目录。
使用 HDFS 命令拷贝文件到其他目录。
命令行导出,直接使用 hive 命令,加入参数 -e 来导出到本地文件
将元数据和数据同时导出
注意:时间不同步,会导致导入导出失败。
静态分区是指增加数据是需要⼿动指定具体的分区⽬录
静态分区的列实在编译时期,通过⽤户传递列名来决定的
静态分区不管有没有数据都将会创建该分区
动态分区增加数据时不⽤⼿动指定分区⽬录,⽽是由系统通过数据来进⾏判断。
动态分区实在SQL执⾏的时候确定的。
动态分区是有结果集将创建分区,否则不创建。
动态分区虽然⽅便快捷,但创建太多分区时可能会占⽤⼤量资源
(局部排序)SORT BY:和 ORDER BY 类似,⽤于对结果进⾏排序,但是它不保证结果的全局排序,只保证在各个 reducer 中排序。
(全局排序)ORDER BY:⽤于对结果集进⾏排序,可以排序⼀个或多个列,并且可以指定升序或降序排列
(分区排序)DISTRIBUTE BY:⽤于将数据分发到指定的 reducer,但是不保证每个 reducer中的数据是有序的。如果需要排序再使⽤ ORDER BY 或 SORT BY。
(分组排序)CLUSTER BY:⽤于对表按照指定的列进⾏分组并且排序,与 GROUP BY 相似。但是CLUSTER BY 是在 Map 端完成的,可以⼤⼤减少数据在 Reduce 端的交换量,提⾼计算效率。
任务读取大文件,最常见的就是读取压缩的不可分割的大文件。
任务需要处理大量相同键的数据。
压缩引发的数据倾斜
单表聚合数据倾斜
JOIN 数据倾斜
业务无关数据引发的数据倾斜
无法消减中间结果的数据量引发的数据倾斜
多维聚合计算数据膨胀引起的数据倾斜
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。