Hive

作者: ___Hello | 来源:发表于2018-10-04 14:26 被阅读0次

    基于hdfs存储数据,
    基于mr分析数据
    所以hive是基于hadoop 数据仓库工具

    将结构化数据文件映射为数据表,提供类sql查询

    本质:将sql转换成mr程序
    主要用途:离线数据分析,比直接mr开发效率高

    image.png

    Hive组件

    用户接口,包括 CLI : command line interface
              JDBC/ODBC:
              webGUI:通过浏览器访问

    元数据存储
    mysql

    解释器、编译器、优化器、执行器
    HQL

    image.png image.png

    安装

    hive,解压即可,不需要每台机器都安装
    元数据存储在mysql,因为自带的derby 跟访问路径有关,每次访问都会生产log
    而用mysql,无论什么路径启动hive,只需要访问mysql即可

    安装mysql
    yum install mysql mysql -server mysql -devel

    安装完, /etc/init.d/mysqld start 启动mysql

    mysql

    mysql> use mysql; --使用mysql库
    mysql> update user set Password=PASSWORD("new pwd") where user='root';
    mysql>flush privileges;
    mysql -u root -p
    Enter password :<your new pwd>
    mysql>grant all privileges on . TO '用户名'@'%' IDENTIFIED BY '密码' with GRANT OPTION; --远程管理msql

    service mysqld status
    chkconfig mysqld on 开机启动
    chkconfig mysqld --list

    配置hive
    cd conf

    hive主要操作
    就是写sql
    create table xx ()
    创建表的时候指定数据的分隔符

    分区partition
    就是引用虚拟字段创建一级子目录,
    虚拟字段不能是表中的字段
    select * from t_user where country = 'china' ;
    这个sql在数据库中,先查出t_user表所有数据,然后根据where条件过滤
    而在数据仓库中,因为有partition确定子目录,查出的数据就是where过滤后的
    --创建分区
    create table 表名 (id int , name string) partitioned by (ext string);
    --分区加载数据
    load data local inpath '/linux_path/x.data' into table 表名;
    load data inpath '/hdfs_path/x.data' into table 表名;

    不分区不分桶加载数据
    xx
    分区不分桶加载数据
    load data操作,实际上是hive帮我们执行 hadoop fs -put x.data /path
    不分区分桶加载数据
    insert + select 操作,在select查询时执行mr程序,对应mr的partitioner

    双分区表
    就是二级子目录
    create table tab_day_hour (id int , name string)
    partitioned by (dt string , hour string);
    dt是一级子目录,hour是二级子目录 /path/dt/hour/xx.data

    分桶
    分桶字段必须是表中字段
    create table tab_day_hour (id int , name string)
    cluster by into num buckets;
    --开启分桶
    set hive.enforce.bucketing = true;
    set mapreduce.job.reduces = 4;
    --分桶加载数据
    insert overwrite table 表名
    select * from 表名 cluster by (列名);

    分区,只是存储细化
    分桶,是执行了rm程序,进行分文件操作(更小目录),hash值分桶

    联合查询 join on会产生笛卡儿积现象
    select A.* ,B.* from A join on A.id = B.id ;


    image.png

    如果表数据量巨大,造成笛卡儿积很庞大
    当根据id分桶后,1这个人在A表就在一个桶,在B表就在一个桶
    针对这2个小桶,再做笛卡儿积时,数据量小很多很多,所以分桶应用背景孕育而生!!!为提高查询效率


    image.png

    内部表 受hive管理
    外部表 不受hive管理

    相关文章

      网友评论

          本文标题:Hive

          本文链接:https://www.haomeiwen.com/subject/jisxaftx.html