• 大数据笔记(十五)——Hive的体系结构与安装配置、数据模型


    一.常见的数据分析引擎

    1. HiveHive是一个翻译器,一个基于Hadoop之上的数据仓库,把SQL语句翻译成一个  MapReduce程序。可以看成是Hive到MapReduce的映射器。

         Hive       HDFS

        表         目录

        数据       文件

        分区       目2

             2.Pig

             3.Impala

             4.Spark SQL

    二.Hive 的体系结构

      用户接口主要有三个:

      1.CLI Shell命令行

      2.JDBC/ODBC:Hive的Java,与传统JDBC相似

      3.Web管理界面 

     

    三.Hive的安装和配置

    1、安装模式:嵌入模式   ----> 需要Hive自带的一个关系型数据库:Derby

          本地模式、远程模式   ----> 需要MySQL数据库的支持

    tar -zxvf apache-hive-2.3.0-bin.tar.gz -C ~/training/

    环境变量:vi ~/.bash_profile

    HIVE_HOME=/root/training/apache-hive-2.3.0-bin
    
    export HIVE_HOME
    
    PATH=$HIVE_HOME/bin:$PATH
    
    export PATH

    2、嵌入模式

    1)使用Hive自带的Derby数据库来存储元信息

    2Hive只支持一个连接

         创建 conf/hive-site.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    
    <configuration>  
    
    <property>
    
      <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>
    
      <name>hive.metastore.local</name>
    
      <value>true</value>
    
    </property>
    
     
    
    <property>
    
      <name>hive.metastore.warehouse.dir</name>
    
      <value>file:///root/training/apache-hive-2.3.0-bin/warehouse</value>
    
    </property>
    
    </configuration>

    初始化MetaStore

    schematool -dbType derby -initSchema

     日志:

     Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.

    3.远程模式:MySQL

    1)配置MySQL的数据库:http://www.mysqlfront.de/

    2)配置hive-site.xmlJDBC的参数

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    
    <configuration>  
    
    <property>
    
      <name>javax.jdo.option.ConnectionURL</name>
    
      <value>jdbc:mysql://localhost:3306/hive?useSSL=false</value>
    
    </property>
    
     
    
    <property>
    
      <name>javax.jdo.option.ConnectionDriverName</name>
    
      <value>com.mysql.jdbc.Driver</value>
    
    </property>
    
     
    
    <property>
    
      <name>javax.jdo.option.ConnectionUserName</name>
    
      <value>hiveowner</value>
    
    </property>
    
     
    
    <property>
    
      <name>javax.jdo.option.ConnectionPassword</name>
    
      <value>Welcome_1</value>
    
    </property>
    
     
    
    </configuration>

    3)把MySQL数据库的驱动放到: Hive/lib

    4)初始化MySQL数据库

     老版本的Hive:第一次运行Hive

     新版本的hiveschematool -dbType mysql -initSchema

    四. Hive的数据模型

    1. 内部表:相当于MySQLOracle)中表,将数据保存到Hive自己的数据仓库的 目录中: /usr/hive/warehouse

    建表:

    create table emp
    
    (empno int,
    
    ename string,
    
    job string,
    
    mgr int,
    
    hiredate string,
    
    sal int,
    
    comm int,
    
    deptno int
    
    );

    创建表,并且指定分隔符

    create table emp1
    
    (empno int,
    
    ename string,
    
    job string,
    
    mgr int,
    
    hiredate string,
    
    sal int,
    
    comm int,
    
    deptno int
    
    )row format delimited fields terminated by ',';

    导入数据:load相当于ctrl+X

    load data inpath '/scott/emp.csv' into table emp;   ----> 导入HDFS

    load data local inpath '/root/temp/***' into table emp;   ----> 导入本地文件

    创建部门表,保存部门数据

    create table dept
    
    (deptno int,
    
    dname string,
    
    loc string
    
    )row format delimited fields terminated by ',';
    
     
    
    load data inpath '/scott/dept.csv' into table dept;

     2.分区表:提高查询的效率----> 查看SQL的执行计划

            分区 ----> 目录

    *)根据员工的部门号建立分区

    create table emp_part
    
    (empno int,
    
    ename string,
    
    job string,
    
    mgr int,
    
    hiredate string,
    
    sal int,
    
    comm int
    
    )partitioned by (deptno int)
    
    row format delimited fields terminated by ',';

    往分区表中导入数据:指明分区

    insert into table emp_part partition(deptno=10) select empno,ename,job,mgr,hiredate,sal,comm from emp1 where deptno=10;
    
    insert into table emp_part partition(deptno=20) select empno,ename,job,mgr,hiredate,sal,comm from emp1 where deptno=20;
    
    insert into table emp_part partition(deptno=30) select empno,ename,job,mgr,hiredate,sal,comm from emp1 where deptno=30
    3.外部表 external table 相对于内部表

    *)实验的数据

    [root@bigdata11 ~]# hdfs dfs -cat /students/student01.txt

    1,Tom,23

    2,Mary,24

    [root@bigdata11 ~]# hdfs dfs -cat /students/student02.txt

    3,Mike,26

    *)定义:(1)表结构  (2)指向的路径

    create external table students_ext
    
    (sid int,sname string,age int)
    
    row format delimited fields terminated by ','
    
    location '/students';

    4、桶表:本质也是一种分区表,类似Hash分区

        ----> 文件

      创建一个桶表,按照员工的职位job分桶

    create table emp_bucket
    
    (empno int,
    
    ename string,
    
    job string,
    
    mgr int,
    
    hiredate string,
    
    sal int,
    
    comm int,
    
    deptno int
    
    )clustered by (job) into 4 buckets
    
    row format delimited fields terminated by ',';

    使用桶表,需要打开一个开关

    set hive.enforce.bucketing=true;

    使用子查询插入数据

    insert into emp_bucket select * from emp1;

       

    5、视图:view

    *)视图是一个虚表,虚:视图是不存数据的

    *)优点:简化复杂的查询

    *)举例:查询部门名称、员工的姓名

    create view myview
    
    as
    
    select dept.dname,emp1.ename
    
    from emp1,dept
    
    where emp1.deptno=dept.deptno;
    
     
    
    select * from myview;

    6Hive的查询

    1)查询所有的员工信息

           select * from emp1;

    2)查询员工信息:员工号  姓名  薪水

           select empno,ename,sal from emp1;

    3)多表查询:查询部门名称、员工的姓名

    select dept.dname,emp1.ename

    from emp1,dept

    where emp1.deptno=dept.deptno;

    4)子查询:hive只支持:fromwhere后面的子查询

    5)内置函数:select max(sal) from emp1;

    6)n条件函数  就是一个if else: 做一个报表:涨工资,总裁1000 经理800 其他400

    select empno,ename,job,sal,

    case job when 'PRESIDENT' then sal+1000

             when 'MANAGER' then sal+800

     else sal+400

    end

    from emp1;

    select empno,ename,job,sal,

    case job when 'PRESIDENT' then sal+1000

             when 'MANAGER' then sal+800

     else sal+400

    end

    from emp;

  • 相关阅读:
    python 字符串替换
    python 字符串截取
    python 字符串连接
    PHP 做群发短信(短信接口连接问题)
    Yii dropDownList 下拉菜单 联动菜单
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    SQL Server 2008 R2——分组取前几名
    SQL Server 分组后取Top N
    大型网站架构系列:20本技术书籍推荐
    较主流的消息队列的比较与选型
  • 原文地址:https://www.cnblogs.com/lingluo2017/p/8653638.html
Copyright © 2020-2023  润新知