Hive上手指南
正如前面所提到,Hive使用的是名为HiveQL的简化版类SQL语言,其支持数据定义与操作语句。任何一位SQL用户都能在使用Hive时拥有熟悉的使用体验。HiveQL在设计思路上尽量简化了由SQL向其过渡的过程,并能够直接让数据分析机制建立并运行在hadoop之上。
大多数商务智能与SQL开发者工具都能轻松与Hive对接,正如与其它任何数据库相对接一样。在ODBC连接机制的辅助下,用户可以将导入数据并利用PowerPivot for Excel等工具探索并分析数据,进而帮助企业了解到蕴藏在大数据当中的宝贵价值。
HiveQL与标准SQL之间也存在着多项显著区别。Hive 0.13在设计思路上需要利用YARN以及Tez架构对PB级别的数据集进行全表扫描,因此关系型数据库当中的一部分常见功能在Hive当中已经不复存在。缺乏的特性包括事务处理、光标、编报表、行级更新与删除以及对运行中的查询加以撤销等等。
虽然这些功能的缺失不会对数据分析产生影响,但却有可能影响到我们在Hive集群上对现有SQL查询加以使用的能力。查询命令的编写方式可能与其它支持完整SQL语言的引擎有所区别,但经验丰富的传统数据库用户应该不至于在编写Hive查询时遇到阻碍。很多传统SQL编辑环境现在已经可以通过连接机制支持Hive,而Hive表也能够利用多数SQL编辑器实现访问,其中包括甲骨文及微软推出的相关工具。
数据库用户在使用Hive时面临的主要差异在于对存储细节的识别层面。在传统数据库环境当中,数据库引擎控制着指向数据库的全部读取与写入操作。但在Hive方面,数据库表以文件形式被保存在Hadoop分布式文件系统(简称HDFS)当中,而其它应用程序也可以对其加以修改。不过这在某种意义上也算是好事,这意味着Hive会强制要求数据与现有规划的读取机制相匹配,也就是说Hive会针对读取操作对规划加以修改。如果底层数据格式发生变化,Hive将尽力弥合这种差异,但用户也可能因此面对意料之外的调整结果。
Hive用户必须了解数据存储的两大要素:文件格式与压缩机制。经过调整的Hive查询能够对数据库表中的数字、类以及文件作出优化,从而让底层映射-归约作业以更富效率的方式执行。Hive以文本作为默认存储格式,其优势在于能够更轻松地为其它工具所使用。不过作为弊端,我们很难在查询中对于原始文本文件作出优化。
Hive能够读取并写入多种文件格式,并在运行过程中对相关内容进行压缩。不同的文件格式可能给存储要求与查询效率带来巨大影响,大家可以通过以下图表进一步加以了解(由Hortonworks提供)。文件格式属于Hadoop社区的一大研究重点。高效的文件格式既能够降低存储成本,也可以提高查询效率。
HDFS上的文件格式与文件大小。(图表由Hortonworks提供)
大规模数据集的处理流程往往需要分为几步进行,而HiveQL当中包含多种语言结构、用于指定ETL流程。通常情况下,根据具体问题的实际要求,一项作业通常需要保存临时表,而将TB级别的数据移动至HDFS当中显然不切实际。Hive提供三种UDF(即用户定义函数),能够在查询当中被用于完成处理流程定制。由于它们作为Hive查询的组成部分运行而且能够与数据直接对接,因此其执行效率更高且能够消除流程内的中间步骤。UDF必须利用Java语言来编写,因此SQL程序员们可能会面临一些难题——不过Hive工具包的出现在一定程度上消除了此类障碍。如果没有这三种UDF,特定类型的问题将变得更难于解决。