day 45 hive 安装 基础知识

文章目录

  • 一、hive
    • 1、hive 安装
    • 2、hive 测试
  • 二、关于 hive
    • 1、和传统数据库比较
    • 2、存储格式(部分)
      • 1 TextFile
      • 2 RCFile (Record Columnar)
      • 3 ORCFile (Optimized Row Columnar)
      • 4 Parquet
      • 5 SequenceFile
    • 3、关于建表语句
      • 1 关于分隔符
      • 2 关于存储格式
      • 3 关于数据源
      • 4 关于内部表 & 外部表
    • 4、关于数据上传和加载
  • 总结


I know, i know
地球另一端有你陪我




一、hive

Hive 是建立在 Hadoop 上的数据仓库基础构架
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL)
这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制

Hive 定义了简单的类 SQL 查询语言,称为 HQL ,它允许熟悉 SQL 的用户查询数据
同时,也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer
处理内建的 mapper 和 reducer 无法完成的复杂的分析工作

简单理解就是人们嫌 MapReduce 写太麻烦,拿东西封装了一下,将书写格式改为 SQL 风格

1、hive 安装

前提 hadoop 启动!前提 hadoop 启动!前提 hadoop 启动!

1 传包解压

tar -zxvf /usr/local/module/apache-hive-1.2.1-bin.tar.gz -C /usr/local/soft/

2 名字太长了,裁一下

cd /usr/local/soft/
mv apache-hive-1.2.1-bin/ hive-1.2.1	

3 启动配置文件

cd /usr/local/soft/hive-1.2.1/conf
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml	

4 修改配置文件

vim hive-env.sh

//添加三行,根据实际情况
HADOOP_HOME=/usr/local/soft/hadoop-2.7.6
JAVA_HOME=/usr/local/soft/jdk1.8.0_171
HIVE_HOME=/usr/local/soft/hive-1.2.1	

5 修改对应的配置参数 hive-site.xml
   需要找到对应的内容挨个修改
   能直接换就直接替换文件,或者移到 txt 里慢慢查

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://master:3306/hive?characterEncoding=
    UTF-8&amp;createDatabaseIfNotExist=true&amp;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>root</value>
</property>

<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
</property>

<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>

<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>

<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/local/soft/hive-1.2.1/tmp</value>
</property>

6 复制mysql连接工具包到hive/lib

cd /usr/local/soft/hive-1.2.1	
cp /usr/local/module/mysql-connector-java-5.1.49.jar /usr/local/soft/hive-1.2.1/lib/

7 删除hadoop中自带的 jline-2.12.jar

rm -rf /usr/local/soft/hadoop-2.7.6/share/hadoop/yarn/lib/jline-2.12.jar

8 把hive自带的jline-2.12.jar复制到hadoop中

cp  /usr/local/soft/hive-1.2.1/lib/jline-2.12.jar /usr/local/soft/hadoop-2.7.6/share/hadoop/yarn/lib/

9 修改 profile 文件

vim /etc/profile

export HIVE_HOME=/usr/local/soft/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin

10 启动 hive

hive

11 关闭 hive

exit;

2、hive 测试

操作上和 sql 几乎完全相同

1 在 hive 中创建 fghdata 数据库

create database fghdata;

2 切换 fghdata 数据库

use fghdata;

3 建俩表,student 和 score
   详细的丢后面说

create table students(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 


create table score(
    id bigint,
    score_id bigint,
    score int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 

4 查看表信息

desc students;

desc score;

5 从 linux 中上传数据到 hdfs
   详细的也丢后面

hadoop dfs -put linux路径 hdfs路径

6 查表(和 sql 几乎一致)

select * from students
inner join score
on students.id=score.id;

二、关于 hive


1、和传统数据库比较

  1. 查询语言:
    类 SQL 的查询语言 HQL
    熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发

  2. 数据存储位置:
    所有 Hive 的数据都是存储在 HDFS 中;
    数据库则可以将数据保存在块设备或者本地文件系统中

  3. 数据格式:
    Hive 中没有定义专门的数据格式,数据直接读写,不需要要考虑格式;
    数据库中,所有数据都会按照一定的组织存储,加载数据的过程会比较耗时

  4. 数据更新:
    Hive 对数据的改写比较弱化(修改元数据),0.14版本之后支持,需要启动配置项;
    而数据库中的数据通常是需要经常进行修改的

  5. 索引:
    Hive 在加载数据的过程中不会对数据进行任何处理
    因此访问延迟较高,决定了 Hive 不适合在线数据查询;
    数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高

  6. 执行计算:
    Hive 中执行是通过 MapReduce 来实现的;
    而数据库通常有自己的执行引擎(SQL 的 executor)

  7. 数据规模:
    Hive 建立在集群上,可以利用 MapReduce 进行并行计算,支持大规模数据的处理;
    数据库可以支持的数据规模较小

2、存储格式(部分)

1 TextFile

即正常的文本格式,是 hive 默认存储格式
默认是一行一条记录,通过指定的分隔符进行分割
内容是无压缩的,在 HDFS 上是明文,可以直接读取,查看
也因此会占用巨大空间

2 RCFile (Record Columnar)

一种列文件格式,行列存储相结合的存储方式
先将数据按行分块,保证一行的数据都在一个 block 之内,再在 block 中,按列存储数据
按列存储保证数据可以压缩,能够只占用很少空间,代价是读写要额外占用一部分 CPU 资源

3 ORCFile (Optimized Row Columnar)

是对 RCFile 的优化(Optimized :优化)
依然是行列存储相结合的存储方式,拥有更高的压缩比,占用更小的空间
在 MapReduce 中也会使用更少的 task 资源
缺点是写文件会慢一点

4 Parquet

一种存储结构化数据的存储格式,如:List、Map、自定义 class 等
可以避免拿到数据之后,再一层层解析数据

5 SequenceFile

存储二进制形式的 对而设计的一种平面文件
最重要的优点就是Hadoop原生支持较好,有API

3、关于建表语句

    create [external] table 表;名
    (
        字段名1 字段类型1,
        字段名2 字段类型2,
        ...
    )
    //这一句必须写,必须指定列之间的分隔符 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '分隔符'
    
    STORED AS file_format
    
    location '/user/hive/warehouse/库名/表名';

1 关于分隔符

sql 会一行行读取数据,界定一行数据中,不同的字段,需要使用分隔符,必须设置

    ROW FORMAT DELIMITED FIELDS TERMINATED BY '分隔符'  

假设有以下数据,每一个字段由 “,” 分开

	1001,fgh,23,男,一班

建表时设置分隔符为 “,” 后,hive 读取时,便会自动对应到不同的字段中
倘若不匹配,hive 会将整行数据识别至第一个字段,其余字段空数据用 null 补齐
显示为

	1001,fgh,23,男,一班 null null

2 关于存储格式

声明该表的数据,存储的格式,hive 会自动切换读取方式,可选

	STORED AS file_format

不写(使用默认),或 file_format(样例) 均表示 TextFile 存储格式
hive 初始支持三种存储格式 TextFile 、RCFile 、SequenceFile

3 关于数据源

hive 会将表的名字、列、分区、属性(是否为外部表)、数据源等信息保存于元数据
而表的数据源储存于 HDFS 里,可以自定义路径,也可使用默认,因此可选

	location '/user/hive/warehouse/库名/表名'

不写会使用默认路径,即 /user/hive/warehouse/库名/表名
hive 会将目录下的所有文件作为数据源进行读取,因此选择上要注意区分

4 关于内部表 & 外部表

hive 会将数据源的路径与表绑定,用来从中读取数据

内部表 be like

	create table 表名

外部表 be liek

	create external table 表名

当删除表后,倘若是内部表,会连带删除路径及里面的文件
倘若是外部表,仅仅会删除表的信息,一般日常使用会选择外部表


4、关于数据上传和加载

方式一:
在虚拟机中使用 hadoop 指令,如果已经打开 hive ,需要退出,或者复制一部

    hadoop dfs -put linux路径 hdfs路径

hadoop dfs -put /usr/local/data/students.txt
                /user/hive/warehouse/fghdata.db/students;

方式二:
在 hive 中上传,比在 hadoop 中操作 HDFS 要快

    dfs -put linux路径 hdfs路径

dfs -put /usr/local/data/students.txt 
         /user/hive/warehouse/fghdata.db/students;

方式三:
在 hive 中加载(load)HDFS 中文件
实际上是剪切文件,原位置文件将不存在

load data inpath '/HDFS路径' into table 表名(自动找到hdfs的路径)

方式四
在 hive 中加载(load)linux 中文件
实际上是先复制,再剪切,linux 中文件依然存在

load data local inpath '/linux路径' into table 表名(自动找到hdfs的路径)

方式五
在建表时从其他表中注入(insert)数据
缺点是只能使用默认建表格式,默认使用内部表什么的

create table 新表名 as select * from 旧表名

方式六
在 hive 中从其他表中注入数据

insert overwrite/into table 新表名 select * from 就表名

into 是向后添加,overwrite 是清空重写
这种注入会配合新表,更改注入数据的格式


总结

1、清空数据库

truncate table 表名

      可以清空内部表的,不能清空外部表

2、hive 可以理解为把大部分 SQL 语句转换为 MapReduce 来执行
      不需要转换的例如显示全部,因为 cat 这样的指令就可以实现

3、ctrl + l :清屏

4、在 Group by 子句中,Select 查询的列,
      要么需要是 Group by 中的列,
      要么得是用聚合函数(比如 sum、count 等)加工过的列,
      不支持直接引用非 Group by 的列,这一点和 MySQL 有所区别

你可能感兴趣的:(sql)