hive
支持sql标准的数据仓库,可以将sql语句转化成mr程序执行。基础分析一般用hive来做,比较复杂的用mr来做
数据仓库和数据库的区别
    数据仓库:历史数据,面向分析,保证数据的完整性可以允许数据冗余。
    数据库:存储结构化,在线数据,面向业务,使用范式来减少冗余。
hive中有解析器,编译器,优化器。hive最终会将sql语句转成mr程序(select * from 表 除外,消耗时间过长所以不转mr)
hive中也是有表的结构,来处理结构化数据,hive的元数据存储在关系型数据库(默认derby)中,元数据指表的名字、表的列和分区及其属性(是否为外部表)、表的数据所在目录等
架构
Driver:解析器,编译器(将hql转成很多操作符(树状结构),操作符是hive的最小单元,每个操作符表示对hdfs操作或者mr任务),优化器
    常用操作符:select operator(查找),tablescan operator(扫描),limit(限制输出),file output operator(文件输出)。
    hive的解析是通过antlr进行解析的,生成一个语法树生成上面的策略
        将HQL转成一个抽象的语法树,然后再转成一个查询块,接着转成逻辑计划并重写逻辑计划,再将逻辑计划转成物理计划(mr任务,可能有多个),最终从多种物理计划中选择最佳策略
元数据库:存放元数据,需要用到元数据信息执行从这里拿
Thrift:跨语言跨平台的socket通讯组件,可以进行跨语言跨平台的数据交互,支持多种序列化和反序列化,MetaStoreServer模式中hive客户端和MetaStoreServer通讯就是用Thrift组件
Hadoop:hive解析成mr程序后提交给Hadoop进行执行
三种模式(根据元数据存储的位置来划分)
本地模式(测试)
    元数据存放在derby数据库(hive自带)中,在同一台中
单用户模式
    元数据存放在自己选的数据库中,笔者这里用mysql,hive直接从MySQL中获取元数据。
    只允许一个hive客户端来访问MySQL,如果两个hive元数据都放在MySQL中,没有组件对元数据进行管理,两个hive同时操作会出问题
多用户模式
    元数据存放在MySQL中,hive客户端通过MetaStoreServer来从MySQL中获取元数据(多个hive客户端操作一份元数据),采用Thrift协议。
    由MetaStoreServer来管理元数据信息,多个hive通过MetaStoreServer来拿元数据,MetaStoreServer会通过访问的顺序来返回
安装(依赖Hadoop的环境变量,启动Hadoop)
    安装之前需要查看和Hadoop版本:http://hive.apache.org/downloads.html,笔者这里采用的是2.3.4版本
1.本地模式
    cp conf/hive-env.sh.template conf/hive-env.sh
    添加HADOOP_HOME=/opt/hadoop-2.7.5
    cp conf/hive-default.xml.template conf/hive-site.xml
    <configuration>
        <property>
            <!--连接数据库的地址:数据库derby,数据库名称metastore_db,是否需要创建数据库-->
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:derby:;databaseName=metastore_db;create=true</value>
        </property>
        <property>
            <!--驱动包-->
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>org.apache.derby.jdbc.EmbeddedDriver</value>
        </property>
        <property>
            <!--是否使用hive本地来管理元数据,一定是true-->
            <name>hive.metastore.local</name>
            <value>true</value>
        </property>
        <property>
            <!--hive对应HDFS的数据目录-->
            <name>hive.metastore.warehouse.dir</name>
            <value>/user/hive/warehouse</value>
        </property>
    </configuration>
    初始化derby数据库
        bin/schematool -dbType derby -initSchema
    进入hive
        bin/hive
2.单用户模式(依赖MySQL)
    cp conf/hive-env.sh.template conf/hive-env.sh
    添加HADOOP_HOME=/opt/hadoop-2.7.5
    cp conf/hive-default.xml.template conf/hive-site.xml
    <configuration>
        <property>
            <!--HDFS中真实数据目录,空目录或不存在-->
            <name>hive.metastore.warehouse.dir</name>
            <value>/user/hive_remote/warehouse</value>
        </property>
        <property>
            <!--hive本地管理元数据-->
            <name>hive.metastore.local</name>
            <value>true</value>
        </property>
        <property>
            <name>hive.metastore.schema.verification</name>
            <value>false</value>
        </property>
        <property>
            <!--指定文件数据库url,用于存放元数据。格式jdbc:mysql://地址/库?库不存在自动创建-->
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://node3:3306/hive_remote?createDatabaseIfNotExist=true</value>
        </property>
        <property>
            <!--驱动-->
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
            <!--用户名-->
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>root</value>
        </property>
        <property>
            <!--密码-->
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>123456</value>
        </property>
    </configuration>
    添加mysql启动jar包,mysql-connector-java-5.1.32-bin.jar到hive的lib中
    启动Hadoop
    初始化MySQL数据库
        bin/schematool -dbType mysql -initSchema
    进入hive
        bin/hive
    可以在MySQL中看到TBLS表就是来存放hive表的元数据信息,COLUMNS_V2是列的元数据
3.多用户模式
    1)remote一体
        配置MetaStoreServer和hive客户端放在一起
        cp conf/hive-env.sh.template conf/hive-env.sh
        添加HADOOP_HOME=/opt/hadoop-2.7.5
        cp conf/hive-default.xml.template conf/hive-site.xml
        <configuration>
            <property>
                <!--HDFS真实存放数据的目录,空目录或不存在-->
                <name>hive.metastore.warehouse.dir</name>
                <value>/user/hive/warehouse</value>
            </property>
            <property>
                <!--存放元数据地址,hive_remote库为空或者不存在-->
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://node3:3306/hive_remote?createDatabaseIfNotExist=true</value>
            </property>
            <property>
                <!--驱动包-->
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
            </property>
            <property>
                <!--MySQL用户名-->
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value>
            </property>
            <property>
                <!--MySQL密码-->
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
            </property>
            <property>
                <!--不启动本地hive管理元数据功能-->
                <name>hive.metastore.local</name>
                <value>false</value>
            </property>
            <property>
                <!--MetaStoreServer的地址端口-->
                <name>hive.metastore.uris</name>
                <value>thrift://node1:9083</value>
            </property>
        </configuration>
        添加mysql启动jar包,mysql-connector-java-5.1.32-bin.jar到hive的lib中
        启动Hadoop
        初始化MySQL数据库
            bin/schematool -dbType mysql -initSchema
        启动MetaStoreServer
            bin/hive --service metastore
        启动hive
            bin/hive
    2)remote分开
    1、配置MetaStoreServer
        cp conf/hive-env.sh.template conf/hive-env.sh
        添加HADOOP_HOME=/opt/hadoop-2.7.5
        cp conf/hive-default.xml.template conf/hive-site.xml
        <configuration>
            <property>
                <!--HDFS真实存放数据的目录,空目录或不存在-->
                <name>hive.metastore.warehouse.dir</name>
                <value>/user/hive/warehouse</value>
            </property>
            <property>
                <!--存放元数据地址,hive_remote数据库一定保证空或者不存在-->
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://node3:3306/hive_remote?createDatabaseIfNotExist=true</value>
            </property>
            <property>
                <!--驱动包-->
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
            </property>
            <property>
                <!--mysql用户名-->
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value>
            </property>
            <property>
                <!--mysql密码-->
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
            </property>
        </configuration>
        MetaStoreServer节点添加mysql启动jar包,mysql-connector-java-5.1.32-bin.jar到hive的lib中
        启动Hadoop
        初始化MySQL数据库
            bin/schematool -dbType mysql -initSchema
        启动MetaStoreServer
            bin/hive --service metastore
    2、hive客户端配置
        cp conf/hive-env.sh.template conf/hive-env.sh
        添加HADOOP_HOME=/opt/hadoop-2.7.5
        cp conf/hive-default.xml.template conf/hive-site.xml
        <configuration>
            <property>
                <!--HDFS真实存放数据的目录,空目录或不存在,和MetaStoreServer保持一致-->
                <name>hive.metastore.warehouse.dir</name>
                <value>/user/hive/warehouse</value>
            </property>
            <property>
                <!--不启动本地hive管理元数据功能-->
                <name>hive.metastore.local</name>
                <value>false</value>
            </property>
            <property>
                <!--MetaStoreServer的地址端口-->
                <name>hive.metastore.uris</name>
                <value>thrift://node2:9083</value>
            </property>
        </configuration>
        启动hive
            bin/hive
Beeline
hive2中提出,用来管理hive属性的设定,和之前使用方式一样的
在Hadoop的hdfs-site.xml和core-site.xml文件中分布添加
hdfs-site.xml
    <property>  
        <name>dfs.webhdfs.enabled</name>  
        <value>true</value>  
    </property>  
core-site.xml
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
按照上述过程安装后在MetaStoreServer节点启动hiveServer2,如果有metastore则需要启动
    bin/hiveserver2
hive客户端
    bin/beeline(这时只是打开了beeline窗口并没有连接到MetaStoreServer节点)
    连接上MetaStoreServer节点的hiveserver2
    beeline>!connect jdbc:hive2://MetaStoreServer_IP:10000
    然后填写用户,可以填root,因为之前Hadoop的数据是在root用户下创建的。密码为空可直接回车
    默认不启动验证,配置文件中hive.server2.authentication默认为NONE
    或者
    bin/beeline -u jdbc:hive2://MetaStoreServer_IP:10000/库 -n user -w password_file(没有密码去掉-w password_file)
beeline提供jdbc方式访问
例如:(导入commons-lang-2.62,guava-14.0.12,hive-common-2.3.42,hive-jdbc-2.3.42,hive-serde-2.3.42,hive-service-2.3.42,hive-service-rpc-2.3.42,httpclient-4.42,httpcore-4.42,libthrift-0.9.32,slf4j-api-1.7.102的jar包)
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";
    public static void main(String[] args) throws SQLException {
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        }
        Connection con = DriverManager.getConnection("jdbc:hive2://node1:10000/default", "root", "");
        Statement stmt = con.createStatement();
        String sql = "select * from psn";
        ResultSet res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1));
        }
    }
HQL(官网->Language Manual)
数据类型
    复合类型array_type(定义方式array<类型>),map_type(定义方式map<key类型,value类型>),struct_type(结构体)
    基本类型tinyint,smallint,int,bigint,boolean,float,double,string
hive中表分为内部表和外部表
    外部表:数据存放在指定的HDFS路径中,即使执行了删除表命令,但是hdfs上数据不会删除,只是删除了元数据
    内部表:数据存放在hive配置文件所指定的位置中,执行删除表命令,元数据和hdfs数据都会删除
DDL数据定义语言(对数据库表创建、删除、修改等操作)
    创建数据库
        create (database|schema) [if not exists] database_name
        [comment database_comment]
        [location hdfs_path]
        [with dbproperties (property_name=property_value, ...)];
    删除数据库
        drop (database|schema) [if exists] database_name [restrict|cascade];(当前不可以在需要删的库内)
    使用数据库
        use database_name;
    创建表(不指定库会在default库中创建)
        create [external] table [if not exists] [db_name.]table_name
        [(col_name data_type [comment col_comment],...)]
        [comment table_comment]
        [partitioned by (col_name data_type [comment col_comment],...)]
        [[row format row_format]
            row format delimited [fields terminated by char [escaped by char]]
            [collection items terminated by char]
            [map keys terminated by char]
            [lines terminated by char]
            [null defined as char]
        [stored as file_format]]
        [location hdfs_path]
        含义
        external指定内部表还是外部表,不写默认内部表。如果是外部表需要指定location关键字
        [db_name.]指定库
        col_name字段名
        data_type数据类型
        col_comment对字段的描述
        table_comment对表的描述
        partitioned by(注意partitionby的顺序)按照哪些列(这些列不能在前面出现过的)做分区处理,可以对不同场景的数据进行分开管理
            col_name列名
            data_type数据类型
            comment可选的描述
        row_format对行做格式化或者规定序列化和反序列化规则,不指定就用hive默认的规则来做,hive操作的是hdfs上数据所以需要row_format。
            比如:hdfs上数据为1,xiaoming,man,book-shejian-shoot,beijing:wudaokou-huoxing:weizhi,一条结构化数据要映射到hive中需要为它标识以什么做分割为哪一列哪一个数据。
        fields terminated by char指定字段和字段之间的分隔符  
        escaped by char指定分割的类型,默认char类型
        collection items terminated by char指定复合类型array_type里面数据的切分方式
        map keys terminated by char指定复合类型map_type里面数据的切分方式
        lines terminated by char指定每行数据的分隔符,默认/n
        null defined as char指定什么字符为空值
        file_format指定数据存储在hdfs中的文件类型,默认文本类型(也可以做压缩等)
        location指定表为外部表时加上设置存放表数据的hdfs路径
        例如一:通过delimited关键字指定分隔符的方式(hive中已经写好的序列化和反序列化的规则)创建一张表
            create table psn (id int,name string,sex string,likes array<string>,address map<string,string>)
            row format delimited
            fields terminated by ','
            collection items terminated by '-'
            map keys terminated by ':';
        例如二:通过serde关键字指定序列化和反序列化的方式来创建一张表,这样可以自定义序列化和反序列化的规则
            create table psn2
            row format serde "org.apache.hadoop.hive.serde2.columnar.columnarserde"
            stored as rcfile
            as
            select * from psn;
            参照psn表的元数据来创建psn2表(就是两张表的schema一样),并且将as后面的语句所查询的数据放到psn2中
        例如三:通过like关键字来创建表
            create table table_name2
            like table_name
            根据table_name表的元数据来创建table_name2表,两个表的schema相同
    删除表
        drop table table_name;
    截断表,将表中数据清空
        truncate table table_name
    修改表,
        语法和关系型数据库一样
    添加分区
        alter table table_name add partition (dt='2008-08-08', country='us') 根据分区字段来添加具体的值而已,不会添加分区字段
    删除分区(分区中的数据也会跟着删除掉,而且该分区下的所有分区也会删除)
        alter table table_name drop partition (dt='2008-08-08')
    视图和关系型数据库中一样,一般数据库不能对视图插入数据
DML数据操作语言
    插入数据(load方式和insert)
    load:load data [local] inpath 'filepath' [overwrite] into table tablename [partition (partcol1=val1, partcol2=val2 ...)]
        local如果需要上传的文件在hdfs上不用加,如果在本地需要加上(它会先将本地文件上传到HDFS然后再加载到指定分区目录中)
        filepath文件路径
        overwrite是否覆盖
        partition如果创建表的时候使用了分区,那么导入的时候需要加上,而且分区个数要对应
        partcol1=val1分区字段名和分区字段所指定的值
    insert方式插入的速度很慢一般不会使用,但是一般如果需要将结果存到临时表中会用insert
    比如:from table_name 别名
            insert into table table_name1
            select 别名.col1,别名.col2,别名.col3
      或:from table_name 别名
            insert into table table_name1
                select 别名.col1,别名.col2,别名.col3
            insert table table_name2
                select 别名.col1,别名.col2,别名.col3
        如果要覆盖之前的数据,将into换成overwrite
    查询
    select * from table_name where partcol1=val1(根据分区来查找)
    修改数据
    update tablename set column = value [, column = value ...] [where expression]
    删除数据
    delete from tablename [where expression]
正则表达式(官网->Getting Started Guide->Apache Weblog Data)
比如
    create table apachelog (
      host string,
      identity string,
      user string,
      time string,
      request string,
      status string,
      size string,
      referer string,
      agent string)
    row format serde 'org.apache.hadoop.hive.serde2.regexserde'   接的是正则表达式的标准类
    with serdeproperties (
      "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
    )
    stored as textfile;
hive内置函数
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF或链接:https://pan.baidu.com/s/1o26fIzJtTF-kqaDiufvqSQ 提取码:b5dl
自定义函数
UDF一进一出,进入一条数据返回一条数据
UDAF多进一出
UDTF一进多出,复杂类型会用到UDTF
例如:自定义的UDF实现转小写(类继承UDF类重写evaluate方法,类型必须是Hadoop中类型并且结合业务来定)
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.Text;
    public final class Lower extends UDF {
      public Text evaluate(final Text s) {
        if (s == null) { return null; }
        return new Text(s.toString().toLowerCase());
      }
    }
打jar包,将jar包放到MetaStoreServer节点
然后在hive客户端上执行hive>add jar jar包路径 上传jar包。
创建临时函数,在hive客户端执行hive>create temporary function 自定义函数名称(随意起) as 'hive.udf.add(程序的类入口)';
测试
select id,name,tm(sex) from psn;
删除自定义函数hive> drop temporary function 自定义函数名称;
hive优化,链接:https://pan.baidu.com/s/10jVPjYTTecGFPWyJv57Qhg 提取码:9aih

浅谈hive的更多相关文章

  1. [转]浅谈Hive vs. HBase 区别在哪里

    浅谈Hive vs. HBase 区别在哪里 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于HDFS顶层的NoSQL(=No ...

  2. 浅谈Hive vs HBase

     Hive是什么? Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,注意这里不是数据库.Hive可以看作是用户编程接口,它本身不存储和计算数据:它依赖于HDFS(H ...

  3. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  4. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  5. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  6. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  7. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  8. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  9. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  10. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

随机推荐

  1. 用 Python 脚本实现电脑唤醒后自动拍照 截屏并发邮件通知

    背景 背景是这样的, 我的家里台式机常年 休眠, 并配置了 Wake On Lan (WOL) 方便远程唤醒并使用. 但是我发现, 偶尔台式机会被其他情况唤醒, 这时候我并不知道, 结果白白运行了好几 ...

  2. S2-048 CVE-2017-9791 远程命令执行

    漏洞名称 S2-048 CVE-2017-9791 远程命令执行 利用条件 Struts 2.3.x 开启Struts 1 plugin and Struts 1 action插件 漏洞原理 漏洞产生 ...

  3. python进阶之路14 之函数内置方法、可迭代对象、异常捕获处理

    重要内置函数 1.map() 映射 l1 = [1, 2, 3, 4, 5] # def func(a): # return a+1 res = map(lambda x:x+1, l1) print ...

  4. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(3)-再识Charles

    1.简介 上一篇通过宏哥的介绍想必各位小伙伴或者童鞋们对Charles已经有了一个理性地认识,今天宏哥在从Charles的外貌介绍和分享一下,让小伙伴们或者童鞋们再对Charles有一个感性的认识,今 ...

  5. [Unity]Update()与FixedUpdate()

    Update()介绍 首先我们从官方文档的介绍了解: MonoBehaviour.Update() Description Update is called every frame, if the M ...

  6. ASP.NET 6.0 Core 迁移 ASP.NET Core 7.0

    2022年微软发布了.NET 7, 同时提供了详细的升级迁移方案. Migrate from ASP.NET Core 6.0 to 7.0 今天给大家简单整理.分享一篇文章. 一.首先需要升级Vis ...

  7. vs2019 内核驱动编译失败:网络共享盘问题

    怀念2008 我以为这个年代了,中文路径问题应该解决了,记得vs 2008写c的时候曾因中文路径的问题导致编译不通过,从2015版本开始发现有时候项目名称和路径里包含中文也可以编译通过了,习惯之后后面 ...

  8. 公司规定所有接口都用 post 请求,这正确么?

    目录 背景 get 与 post 的区别 所有接口都用 post 请求? 背景 最近在逛知乎的时候发现一个有趣的问题:公司规定所有接口都用 post 请求,这是为什么? 看到这个问题的时候其实我也挺有 ...

  9. MySQL 中一条 sql 的执行过程

    一条 SQL 的执行过程 前言 查询 查询缓存 分析器 优化器 执行器 数据更新 日志模块 redo log (重做日志) binlog (归档日志) undo log (回滚日志) 两阶段提交 为什 ...

  10. final关键字用于修饰类-final关键字用于修饰成员方法

    final关键字与四种用法 概念 学习了继承后,我们知道,子类可以在父类的基础上改写父类内容容,比如,方法重写.那么我们能不能随意的继承 API中提供的类,改写其内容呢?显然这是不合适的.为了避免这种 ...