zoukankan      html  css  js  c++  java
  • HIVE入门

    一、Hive基本原理

           hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类似sql查询(HQL)功能,可以将sql语句转换为MapReduce任务,避免开发专门的MapReduce应用,十分适合数据仓库的统计分析。

           Hive将元数据存储在数据库(RDBMS)中,比如MySQL、Derby中。Hive有三种模式连接到数据,其方式是:单用户模式,多用户模式和远程服务模式。(也就是内嵌模式
    、本地模式、远程模式)。

    二、Hive的体系结构:

    注:图片来源于网络,如有侵权,请联系删除

    Metastore:元数据,存储系统目录以及关于表、列、分区等的元数据。
    Driver     :驱动,控制 HiveQL 生命周期的组件,当 HiveQL 查询穿过 Hive时,该驱动管理着会话句柄以及任何会话的统计。
    Query Compiler:查询编译器, 将HQL编译成有向无环图(directed acyclic graph, DAG)形式的map/reduce任务。
    Execution Engine :执行引擎 ,依相依性顺序(dependency order)执行由编译器产生的任务。
    HiveServer        : 提供健壮的接口(thrift interface )、JDBC/ODBC 服务以及整合 Hive 和其它应用。
    Client               :类似命令行接口CLI(Command Line Interface), web UI 以及JDBC/ODBC驱动。

    执行过程:

    Hive的工作原理简单的说就是一个查询引擎,执行顺序是:

    接收SQL

    词法分析/语法分析:使用antlr将SQL语句解析成抽象语法树(AST)

    语义分析:从Metastore获取模式信息,验证SQL语句中队表名,列名,以及数据类型的检查和隐式转换,以及Hive提供的函数和用户自定义的函数(UDF/UAF)

    逻辑计划生成:生成逻辑计划--算子树

    逻辑计划优化:对算子树进行优化,包括列剪枝,分区剪枝,谓词下推等

    物理计划生成:将逻辑计划生成包含由MapReduce任务组成的DAG的物理计划

    物理计划执行:将DAG发送到Hadoop集群进行执行

    最后返回查询结果

    三、HIVE中的表介绍

    Hive的存储是建立在Hadoop文件系统之上的,其主要包括四种表类型:
    Internal Table  : 内部表

    External Table  :外部表

    Partition Table   :  分区表

    Bucket   Table  :桶表

    四、Hive数据库命令

    1、显示所有数据库:show  databases;

    2、使用某一个数据库,例如messagelog:use messagelog;

     

    五、Hive建表操作

    1、Internal Table

    CREATE TABLE ratings (
      userid INT,
      movieid INT,
      rating INT,
      unixtime STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    STORED AS TEXTFILE;
    

    执行截图:

    插入数据:

    LOAD DATA LOCAL INPATH '/opt/ratings.txt'  OVERWRITE INTO TABLE ratings;
    

    执行截图:

    查询表:

    2、External Table

    CREATE EXTERNAL TABLE ex_ratings (
      userid INT,
      movieid INT,
      rating INT,
      unixtime STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','  
     STORED AS TEXTFILE  
     LOCATION '/external/hive'; 
    

    执行结果:

    插入数据:

    LOAD DATA LOCAL INPATH '/opt/ratings.txt'  OVERWRITE INTO TABLE ex_ratings;

    执行结果:

    数据文件hdfs存储路径:

    我们可以看到数据文件已经上传到对应的hdfs目录下。

    3、Partition Table

    建表语句:

    CREATE TABLE part_ip_test(id int,
          name string,  
         ip STRING)  
     PARTITIONED BY(country STRING)  
     ROW FORMAT DELIMITED FIELDS TERMINATED BY '	'  
     STORED AS TEXTFILE;

    执行结果:

    插入数据:

    load data local inpath '/opt/ip_china.txt' overwrite  into table part_ip_test   partition(country='china');  
    load data local inpath '/opt/ip_japan.txt' overwrite  into table part_ip_test   partition(country='japan');
    

    执行结果:

    4、Bucket   Table

    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。

    Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

    把表(或者分区)组织成桶(Bucket)有两个理由:

    (1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

    (2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

    要使用桶表,要先进行如下环境变量设置:

    set hive.enforce.bucketing = true;

    建表语句:

    CREATE TABLE buck_ip_test(id int,
          name string,  
         ip STRING,
         country STRING)  
     clustered by (country) sorted by(name) into 4 buckets 
     ROW FORMAT DELIMITED FIELDS TERMINATED BY '	'  
     STORED AS TEXTFILE; 


    插入数据:

    insert overwrite table buck_ip_test select * from part_ip_test;

    查询结果:

    查看hdfs文件:

     

     可以看到生成了4个分区文件。

  • 相关阅读:
    JavaScript 获得今天的日期 (yy-mm-dd)格式
    web前端筛选页面(类似大众点评)
    JS 获取浏览器的名称和版本信息
    java 接收json数据
    指定配置文件启动mongodb
    linux写一个定时任务
    windows杀死占用端口
    mongodb聚合操作汇总
    jpa常用查询
    idea 更换主题
  • 原文地址:https://www.cnblogs.com/cangos/p/6435267.html
Copyright © 2011-2022 走看看