zoukankan      html  css  js  c++  java
  • hive框架原理

    一、hive基础

    Hive是一个基于Hadoop的数据仓库,使用HQL作为查询接口、HDFS作为存储底层、mapReduce作为执行层,设计目的是让SQL技能良好,但不熟悉MapReduce 、Java技能较弱的分析师可以查询海量数据。Hive提供了比较完整的SQL功能(本质是将SQL转换为MapReduce),自身最大的缺点就是执行速度慢(因为实际执行就是一系列的MapReduce作业,而MapReduce中间结果都存储在磁盘,IO导致速度很慢。所有也有基于spark的hive项目:hive on spark)。Hive有自身的元数据结构描述,可以使用MySqlProstgreSqloracle 等关系型数据库来进行存储,但请注意Hive中的所有数据都存储在HDFS中。

    Hive本质上可以理解为一个客户端工具,一个将sql语句解析成MapReduce作业的引擎,随后就是一般的在Hadoop上面运行MapReduce作业。Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。 Hive又作为一种数据仓库系统,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,Hive可以把SQL中的表、字段转换为HDFS中的目录、文件。Hive将表中的元数据信息存储在数据库中,如derby(自带的)、Mysql(实际工作中配置的),Hive中的元数据信息包括表的名字、表的列和分区、表的属性(是否为外部表等)、表的数据所在的目录等。Hive中的解析器在运行的时候会读取元数据库MetaStore中的相关信息。

    二、hive基础表操作

    1、Hive中的两种表概念:

    1.1、内部表(managed table),数据文件、统计文件、元数据都由Hive自己管理,换句话说,这个表数据存储在哪里我们不用关心,也不用提供,Hive默认存储在HDFS。Hive能管理原始数据的整个生命周期。Hive表删除后,数据也随之删除。

    如果我们没有数据文件,只是想创建一个Hive表,这个Hive表以后用于存储数据用,或从其他数据源导入,或程序写入等。内部表看起来就像RDBMS的数据表,Hive有足够大的权限可以操纵表里的数据,包括删除。
    创建外部表时,使用的语句是create external table。而默认情况下,不使用external则是默认创建内部表。

    create table tb (id int, name String, age int)
    row format delimited  # 一行文本对应表中一条记录
    fields terminated by '	'; # 指定输入字段的间隔符
    

      

    1.2、外部表(external table),数据文件存储在其他系统中,可能是HDFS,也可能是HBase、ASV等,Hive只保留映射关系,但Hive表删除后,数据不会丢失,仍然存在于其他系统中。

    create external table lang (    
        id int,    
        name string,    
        field1 int) 
        row format delimited     
        fields terminated by ','    
        lines terminated by '
    '    
      stored as textfile     # 声明存储的文件为什么格式
      location "/ez/example/lang.csv"   # 指定建立外部表的文件系统连接

    1.3、分区表

    分区是将HDFS中不同分区的数据文件存放于不同的目录下。例如一个Hive内部表数据保存于HDFS中/user/hive/warehouse/mytest.db/下,这个目录下全是数据文件(可能是文本文件格式,也可能是其他格式,根据file_format指定)。这时候若引入一个字段用于分区,则将会在这个目录下产生新的目录,每个目录对应一个分区。每个分区数据分别存在自己对应的目录下。这样查询效率也会更高。

    create table partition_tb (    
    id int, col1 string, col2 string)    
    partitioned by (type int)    
    stored as ORC 

    为表做分区主要考虑的是效率问题,重点需要考虑分区的列的基数(也就是该列包含唯一值的个数)。选择基数很高的列来做分区会导致数据严重的碎片化。不要对数据过分的分区。如果有太多的小分区,那么对这么多的分区目录进行扫描代价也是比较高的,甚至可能比全表扫描还高。

  • 相关阅读:
    [野狐行网游研究][二期][8.21更新]
    Movidius的深度学习入门
    Linux下深度学习常用工具的安装
    Intel AI Cloud 使用
    【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
    策略模式
    Java 8 中常用的函数式接口
    MySQL权限管理(五)
    kickstart无人值守安装
    pymysql模块使用
  • 原文地址:https://www.cnblogs.com/hugh-tan/p/8835989.html
Copyright © 2011-2022 走看看