zoukankan      html  css  js  c++  java
  • hive学习(1)

    什么是Hive

    Hive是基于Hadoop的一个数据仓库工具(E抽取T转换L加载),可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
    本质是:将HQL转化成MapReduce程序
    Hive是一个翻译工具,将sql翻译为底层mr程序的,它不是数据库,只不过在表现形式上和数据库有很多类似而已(比如表、database、字段等)
    1)Hive处理的数据存储在HDFS
    2)Hive分析(翻译工作)数据底层的实现是MapReduce

    3)执行程序运行在Yarn上
    Hadoop = HDFS + MR + YARN;
    综上所述,可以认为Hive这个软件工具是Hadoop的一个客户端

    Hive的优缺点

    优点
    1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
    2)避免了去写MapReduce,减少开发人员的学习成本。
    3)Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
    4)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。Select length(345) from dual;
    5)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
    缺点
    1.Hive的HQL表达能力有限
    (1)迭代式算法无法表达
    (2)数据挖掘方面不擅长
    2.Hive的效率比较低
    (1)Hive自动生成的MapReduce作业,通常情况下不够智能化
    (2)Hive调优比较困难,粒度较粗

     hive安装

    (1)把apache-hive-1.2.1-bin.tar.gz上传到linux的/opt/software目录下
    (2)解压apache-hive-1.2.1-bin.tar.gz到/opt/module/目录下面
      [hadoop@hadoop101 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt/module/3)修改apache-hive-1.2.1-bin.tar.gz的名称为hive
      [hadoop@hadoop101 module]$ mv apache-hive-1.2.1-bin/ hive
    (4)修改/opt/module/hive/conf目录下的hive-env.sh.template名称为hive-env.sh
      [hadoop@hadoop101 conf]$ mv hive-env.sh.template hive-env.sh
    (5)配置hive-env.sh文件 
        (a)配置HADOOP_HOME路径
        export HADOOP_HOME=/opt/module/hadoop-2.7.2
        (b)配置HIVE_CONF_DIR路径
        export HIVE_CONF_DIR=/opt/module/hive/conf

    MySql安装

    使用宝塔直接安装
    1.进入mysql
    [root@hadoop101 mysql-libs]# mysql -uroot -p123
    2.显示数据库
    mysql>show databases;
    3.使用mysql数据库
    mysql>use mysql;
    4.展示mysql数据库中的所有表
    mysql>show tables;
    5.展示user表的结构
    mysql>desc user;
    6.查询user表
    mysql>select user, host, password from user;  (大小写均可)
    7.修改user表,把Host字段内容修改为%
    mysql>update user set host='%' where host='localhost';
    8.删除root用户的其他host
    mysql>delete from user where Host='hadoop102';
    mysql>delete from user where Host='127.0.0.1';
    mysql>delete from user where Host='::1';
    9.刷新
    mysql>flush privileges;

    Hive元数据配置到MySql

    驱动拷贝
      1.在/opt/software/mysql-libs目录下解压mysql-connector-java-5.1.27.tar.gz驱动包
        [hadoop@hadoop101 mysql-libs]# tar -zxvf mysql-connector-java-5.1.27.tar.gz
      2.拷贝/opt/software/mysql-libs/mysql-connector-java-5.1.27目录下的mysql-connector-java-5.1.27-bin.jar到/opt/module/hive/lib/
        [root@hadoop101 mysql-connector-java-5.1.27]# cp mysql-connector-java-5.1.27-bin.jar
           /opt/module/hive/lib/
    配置Metastore到MySql
      1.在/opt/module/hive/conf目录下创建一个hive-site.xml
        [root@hadoop101 conf]$ touch hive-site.xml
        [root@hadoop101 conf]$ vi hive-site.xml
    根据官方文档配置参数,拷贝数据到hive-site.xml文件中
      https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
    <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop101:3306/metastore?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property>
      <property>
          <name>hive.cli.print.header</name>
          <value>true</value>
      </property>
    
      <property>
          <name>hive.cli.print.current.db</name>
          <value>true</value>
      </property>
      <property> <name>javax.jdo.option.ConnectionPassword</name> <value>000000</value> <description>password to use against metastore database</description> </property>
    </configuration>
    配置完毕后,如果启动hive异常,可以重新启动虚拟机。(重启后,别忘了启动hadoop集群)

    注意 :  执行hive命令,启动终端,会报错

    如何解决哪?依次执行下面的3mysql命令:

    drop database metastore;

    create database metastore;

    alter database metastore character set latin1; 

     hive操作

    数据库相关

    1  create database db_hive;
    2  create database if not exists db_hive;
    3  create database db_hive2 location '/db_hive2.db';
    4  show databases;
    5  show databases like 'db_hive*';
    6  desc database db_hive;
    7  drop database db_hive2;

    表相关

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
    [(col_name data_type [COMMENT col_comment], ...)] 
    [COMMENT table_comment] 
    [ROW FORMAT row_format] 
    [STORED AS file_format] 
    [LOCATION hdfs_path]
    LIKE tablename
    
    例如
    create external  table if not exists t3 (id int comment "id",name string comment "string") 
    comment "studnet" ROW FORMAT DELIMITED FIELDS TERMINATED BY " " STORED AS TEXTFILE location "/user/t3" ;

    解释
    (1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
    
    (2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;
       若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。 (3)COMMENT:为表和列添加注释。 (4)ROW FORMAT DELIMITED FIELDS TERMINATED BY char (5)STORED AS指定存储文件类型 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件) 如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。 (6)LOCATION :指定表在HDFS上的存储位置。 (7)LIKE允许用户复制现有的表结构,但是不复制数据。 如果当前创建的表create table table1,希望table1和已经存在的table0的表结构相同,就可以使用like指令直接创建,create table table1 like table0;

    修改删除表

    1   ALTER TABLE table_name RENAME TO new_table_name
    2   alter table dept_partition add columns(deptdesc string);
    3   desc dept_partition;
    4   alter table dept_partition change column deptdesc desc int;
    5   drop table dept_partition;

    向表中装载数据(Load

    hive> load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student 
    (1)load data:表示加载数据
    (2)local:表示从本地加载数据到hive表(复制);否则从HDFS加载数据到hive表(移动)
    (3)inpath:表示加载数据的路径
    (4)overwrite into:表示覆盖表中已有数据,否则表示追加
    (5)into table:表示加载到哪张表
    (6)student:表示具体的表

    通过查询语句向表中插入数据(Insert

    1    insert into table  student values(1,'wangwang');
    2    insert into table  student select * from student2;
    3    create table if not exists student3  as select id, name from         
          student;
    4    create table if not exists student4(
                  id int, name string
                  )
                  row format delimited fields terminated by '	'
                  location '/user/hive/warehouse/student4';
    5    

    数据导出

    Insert导出
      1.将查询的结果导出到本地
      hive (default)> insert overwrite local directory '/opt/module/datas/export/student'
                select * from student;
      2.将查询的结果格式化导出到本地
      hive(default)>insert overwrite local directory '/opt/module/datas/export/student1'
               ROW FORMAT DELIMITED FIELDS TERMINATED BY '	'             select * from student;
      3.将查询的结果导出到HDFS上(没有local)
      hive (default)> insert overwrite directory '/user/bigdata/student2'
                 ROW FORMAT DELIMITED FIELDS TERMINATED BY '	' 
                 select * from student;
    Hadoop命令导出到本地
      hive (default)> dfs -get /user/hive/warehouse/student/month=201809/student.txt
      /opt/module/datas/export/student3.txt;
      Hive Shell 命令导出到本地
      基本语法:(hive -f/-e 执行语句或者脚本 > file)
      [hadoop@hadoop101 hive]$ bin/hive -e 'select * from default.student;' >
       /opt/module/datas/export/student4.txt;
    Export导出到HDFS上[了解]
      (default)>export table default.student to
       '/user/hive/warehouse/export/student';
    Sqoop导出
    我凝视这恒星,等待这那场风暴,我已经准备好了
  • 相关阅读:
    用原生JS写根据时间显示问候语
    用原生JS写洗扑克牌
    rabbitmq系列——(0 导航)
    rabbitmq系列——(0 Windows下安装)
    rabbitmq系列——(1生产者消费者点对点)
    rabbitmq系列——(2 多生产多消费)
    rabbitmq系列——(3 优先级 )
    rabbitmq系列——(4 Exchange Type -- Direct)
    rabbitmq系列——(4 Exchange Type -- Fanout)
    rabbitmq系列——(4 Exchange Type -- Topic)
  • 原文地址:https://www.cnblogs.com/cheng5350/p/11767353.html
Copyright © 2011-2022 走看看