数据库之Hive概论和架构和基本操作

目录
  • Hive概论
  • Hive架构
  • Hive安全和启动
  • Hive数据库操作
  • Hive内部表操作-数据添加
  • Hive内部表特点
  • Hive外部表操作
  • Hive表操作-分区表

Hive概论

Hive是一个构建在Hadoop上的数据仓库框架,最初,Hive是由Facebook开发,后台移交由Apache软件基金会开发,并做为一个Apache开源项目。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

Hive它能够存储很大的数据集,可以直接访问存储在Apache HDFS或其他数据存储系统(如Apache HBase)中的文件。

Hive支持MapReduce、Spark、Tez这三种分布式计算引擎。

Hive架构

Hive是建立在Hadoop上的数据仓库基础架构,它提供了一系列的工具,可以存储、查询、分析存储在分布式存储系统中的大规模数据集。Hive定义了简单的类SQL查询语言,通过底层的计算引擎,将SQL转为具体的计算任务进行执行。

客户端:写类SQL语句

Hive驱动器:解析、优化SQL

计算引擎:通过计算引擎来执行SQL

数据存储:存储源数据和结果数据

MapReduce

它将计算分为两个阶段,分别为Map和Reduce。对于应用来说,需要想办法将应用拆分为多个map、reduce,以完成一个完整的算法。

MapReduce整个计算过程会不断重复的往磁盘里读写中间结果。导致计算速度比较慢,效率比较低。

Tez

把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大DAG任务,减少了Map/Reduce之间的文件存储。

Spark

Apache Spark是一个快速的,多用途的集群计算系统,相对于Hadoop MapReduce将中间结果保存在磁盘中,Spark使用了内存保存中间结果,能在数据尚未写入硬盘时在内存中进行计算,同时Spark提供SQL支持。 Spark 实现了一种叫RDDs的DAG执行引擎,其数据缓存在内存中可以进行迭代处理。

使用的是Hive+Spark计算引擎

Hive安全和启动

1、启动集群中所有的组件

cd /export/onekey

./start-all.sh

2、使用终端链接Hive

1)、进入到/export/server/spark-2.3.0-bin-hadoop2.7/bin目录中

2)、执行以下命令:./beeline

3)、输入:!connect jdbc:hive2://node1:10000,回车

4)、输入用户名:root

5)、直接回车,即可使用命令行连接到Hive,然后就可以执行HQL了。

[root@node1 onekey]# cd /export/server/spark-2.3.0-bin-hadoop2.7/bin
[root@node1 bin]# ./beeline
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:hive2://node1:10000
Connecting to jdbc:hive2://node1.itcast.cn:10000
Enter username for jdbc:hive2://node1.itcast.cn:10000: root
Enter password for jdbc:hive2://node1.itcast.cn:10000: 直接回车
2021-01-08 14:34:24 INFO  Utils:310 - Supplied authorities: node1.itcast.cn:10000
2021-01-08 14:34:24 INFO  Utils:397 - Resolved authority: node1.itcast.cn:10000
2021-01-08 14:34:24 INFO  HiveConnection:203 - Will try to open client transport with JDBC Uri: jdbc:hive2://node1.itcast.cn:10000
Connected to: Spark SQL (version 2.3.0)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://node1.itcast.cn:10000> 。

连接成功的标志。

Hive的数据库和表

Hive数仓和传统关系型数据库类似,管理数仓数据也有数据库和表

Hive数据库操作

1)、创建数据库-默认方式

create database if not exists myhive;

show databases; #查看所有数据库

说明:

1、if not exists:该参数可选,表示如果数据存在则不创建(不加该参数则报错),不存在则创建

2、hive的数据库默认存放在/user/hive/warehouse目录

2)、创建数据库-指定存储路径

create database myhive2 location '/myhive2';

show databases; #查看所有数据库

说明:

1、location:用来指定数据库的存放路径。

3)、查看数据库详情信息

desc database myhive;

4)、删除数据库

删除一个空数据库,如果数据库下面有数据表,就会报错

drop database myhive;

强制删除数据库,包含数据库下面的表一起删除

drop database myhive2 cascade;

5)、创建数据库表语法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[LOCATION hdfs_path]

6)、表字段数据类型

7)、表字段数据类型-复杂类型

8)、 内部表操作-创建表

未被external修饰的内部表(managed table),内部表又称管理表,内部表不适合用于共享数据。

create database  mytest;  #创建数据库

user mytest; #选择数据库

create table stu(id int, name string);

show tables; #查询数据

创建表之后,Hive会在对应的数据库文件夹下创建对应的表目录。

9)、内部表操作-查看表结构/删除表

查看表结构

desc stu;#查看表结构基本信息

desc formatted stu;查看表结构详细信息

删除表

drop table stu;

Hive内部表操作-数据添加

1)、方式1-直接插入数据

对于Hive中的表,可以通过insert into 指令向表中插入数据

user mytest; #选择数据库
create table stu(id int, name string); # 创建表
# 向表中插入数据
insert into stu values(1, 'test1');
insert into stu values(2, 'test2');

select * from stu; #查询数据

2)、方式2-load数据加载

Load 命令用于将外部数据加载到Hive表中

语法:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)]

说明:
  LOCAL 表示从本地文件系统加载,否则是从HDFS加载

应用1-本地加载

#创建表,同时指定文件的分隔符
create table if not exists stu2(id int ,name string)
row format delimited fields terminated by '\t' ;
#向表加载数据
load data local inpath '/export/data/hivedatas/stu.txt' into table stu2;

应用2-HDFS加载

#创建表,同时指定文件的分隔符
create table if not exists stu3(id int ,name string)
row format delimited fields terminated by '\t' ;
#向表加载数据
hadoop fs -mkdir -p /hivedatas
cd /export/data/hivedatas
hadoop fs –put stu.txt /hivedatas/
load data inpath '/hivedatas/stu.txt' into table stu3; 

Hive内部表特点

1)、元数据

Hive是建立在Hadoop之上的数据仓库,存在hive里的数据实际上就是存在HDFS上,都是以文件的形式存在

Hive元数据用来记录数据库和表的特征信息,比如数据库的名字、存储路径、表的名字、字段信息、表文件存储路径等等

Hive的元数据保存在Mysql数据库中

2)、内部表特点

hive内部表信息存储默认的文件路径是在/user/hive/warehouse/databasename.db/tablename目录

hive 内部表在进行drop操作时,其表中的数据以及表的元数据信息均会被删除

内部表一般可以用来做中间表或者临时表

Hive外部表操作

1)、创建表

创建表时,使用external关键字修饰则为外部表,外部表数据可用于共享

#创建学生表
create external table student (sid string,sname string,sbirth string , ss       ex string) row format delimited fields terminated by ‘\t' location ‘/hive_table/student‘;

#创建老师表
create external table teacher (tid string,tname string) row format delimited fields terminated by '\t' location ‘/hive_table/teacher‘;

创建表之后,Hive会在Location指定目录下创建对应的表目录。

2)、加载数据

外部表加载数据也是通过load命令来完成

#给学生表添加数据
load data local inpath '/export/data/hivedatas/student.txt' into table student; 

#给老师表添加数据,并覆盖已有数据
load data local inpath '/export/data/hivedatas/teacher.txt' overwrite into table teacher;

#查询数据
select * from student;
select * from teacher;

3)、外部表特点

外部表在进行drop操作的时候,仅会删除元数据,而不删除HDFS上的文件

外部表一般用于数据共享表,比较安全

4)、安装Visual Studio Code

开发Hive的时候,经常要编写类SQL,

Hive表操作-分区表

1)、介绍

在大数据中,最常用的一种思想是分治,分区表实际就是对应hdfs文件系统上的独立的文件的文件夹,该文件夹下是该分区所有数据文件。

分区可以理解为分类,通过分类把不同类型的数据放到不同的目录下。

Hive中可以创建一级分区表,也可以创建多级分区表

2)、创建一级分区表

create table score(sid string,cid string, sscore int) partitioned by (month string) row format delimited fields terminated by '\t';

3)、数据加载

load data local inpath '/export/data/hivedatas/score.txt' into table score partition (month='202006');

4)、创建多级分区表

create table score2(sid string,cid string, sscore int) partitioned by (year string,month string, day string) row format delimited fields terminated by '\t'; 

5)、数据加载

load data local inpath '/export/data/hivedatas/score.txt' into table score2 partition(year='2020',month='06',day='01');

加载数据之后,多级分区表会创建多级分区目录。

6)、查看分区

show partitions score;

7)、添加分区

alter table score add partition(month='202008'); alter table score add partition(month='202009') partition(month = '202010');

8)、删除分区

alter table score drop partition(month = '202010');

9)、Array类型

Array是数组类型,Aarray中存放相同类型的数据

源数据:

zhangsan beijing,shanghai,tianjin,hangzhouwangwu changchun,chengdu,wuhan,beijin

建表数据:

create external table hive_array(name string, work_locations array<string>) row format delimited fields terminated by '\t' collection items terminated by ','; 

建表语句:

load data local inpath '/export/data/hivedatas/array_data.txt' overwrite into table hive_array;

查询语句:

-- 查询所有数据 select * from hive_array; -- 查询loction数组中第一个元素 select name, work_locations[0] location from hive_array; -- 查询location数组中元素的个数 select name, size(work_locations) location from hive_array; -- 查询location数组中包含tianjin的信息 select * from hive_array where array_contains(work_locations,'tianjin'); 

以上就是数据库之Hive概论和架构和基本操作的详细内容,更多关于Hive概论和架构和基本操作的资料请关注我们其它相关文章!

(0)

相关推荐

  • hive数据仓库新增字段方法

    目录 新增字段 1.方法1 cascade知识 2.方法2 (适用于外部表) 3.方法3(下下策) 修改字段 删除列 新增字段 1.方法1 alter table 表名 add columns (列名 string COMMENT '新添加的列') CASCADE; alter table 表名 add columns (列名 string COMMENT '新添加的列'): hive表中指定位置增加一个字段 分两步,先添加字段到最后(add columns),然后再移动到指定位置(change

  • Python读取Hive数据库实现代码详解

    目录 实际业务读取hive数据库的代码 代码说明和领悟 后续附上修改成mysql的一个例子代码 背景: 在这篇文章之前,我读取数据库的数据没有形成规范,并且代码扩展性不好,使用率不高,而且比较混乱.数据库信息的替换也比较混乱.坏习惯包括:连接数据库之后就开始读数,读完就结束,数据的存放也没有规范,而且容易重复读取. 现在将代码分为几层,一层是底层,就是单独连接数据库,在这基础上封装第二个类别,加上了线程锁和时间表,用于确保读数的稳定和超时错误提醒.第三层才是真正的业务,第三层的类里面封装了很多读

  • Hive导入csv文件示例

    目录 正文 首先创建表 导入数据及查询 其他注意事项 总结 正文 现有文件为csv格式,需要导入hive中,设csv内容如下 1001,zs,23 1002,lis,24 首先创建表 create table if not exists csv2( uid int, uname string, age int ) row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde' stored as textfile ; 导入数据及查询 l

  • Hive常用日期格式转换语法

    目录 获取当前时间 日期格式转换 返回日期中的年,月,日,时,分,秒,当前的周数 计算日期差值 返回当月或当年的第一天 参考汇总 获取当前时间 获取当前时间戳 select unix_timestamp() 把时间戳转为正常的日期 select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') select from_unixtime(unix_timestamp(),'yyyy-MM-dd') 业务中有时存放的是包含毫秒的整数,需要先转

  • Hive日期格式转换方法总结

    目录 背景 时间戳 日期格式转换 背景 日期计算平时在业务取数时经常涉及到,但是数据库中经常存放着不同的日期格式,有的存放是时间戳.有的是字符串等,这时需要对其进行转换才能提取到准确的数据,这里介绍的均是hive里面的函数功能,以下内容均是业务的数据需求经常使用的部分 时间戳 unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒,一般为10位的整数 一个在线工具:http://tools.jb51.net/code/unixtime 时间戳 字符串日期如:'2

  • Hive HQL支持2种查询语句风格

    目录 背景 风格一 风格二 两种风格的区别 背景 在平时业务运营分析中经常会提取数据,也就是大家俗称的Sql Boy,表哥表姐,各大公司数据中台现在大部分用的都是基于Hadoop的分布式系统基础架构,用的比较多的有Hive数据仓库工具,数据分析师在数据查询时用的就是HQL,语法与Mysql有所不同,基本每天都会写大量的HQL语句,但你有试过哪些风格的写法呢?哪种风格的查询语句更容易理解呢?可能不同的人有不同的看法,下面展示具体的风格代码样式,看看你喜欢哪种 Hadoop是一个由Apache基金会

  • 数据库之Hive概论和架构和基本操作

    目录 Hive概论 Hive架构 Hive安全和启动 Hive数据库操作 Hive内部表操作-数据添加 Hive内部表特点 Hive外部表操作 Hive表操作-分区表 Hive概论 Hive是一个构建在Hadoop上的数据仓库框架,最初,Hive是由Facebook开发,后台移交由Apache软件基金会开发,并做为一个Apache开源项目. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. Hive它能够存储很大的数据集,可以直接访

  • MySQL之终端Terminal(dos界面)管理数据库、数据表、数据的基本操作

    MySQL有很多的可视化管理工具,比如"mysql-workbench"和"sequel-pro-". 现在我写MySQL的终端命令操作的文章,是想强化一下自己对于MySQL的理解,总会比使用图形化的理解透彻,因为我本来就比较喜欢写代码.同时写出来这些文章,是想要给大家当个参考,希望也能对大家有所帮助,有所提升,这就是我为什么要写终端操作MySQL的文章了. 注意:MySQL数据库命令不区分大小写.但在MAC的终端,如果你想使用tab自动补全命令,那么你就必须使用大

  • MySQL 数据库中数据表超详细的基本操作

    目录 1. 查看当前数据库中的表 2. 创建表 3. 查看指定表结构 4. 删除表 5. 往表中新增数据 6. 查找表中的数据 6.1 全列查询 6.2 指定列查询 6.3 查询字段为表达式 6.4 给某个列指定常量 6.5 给查询的表达式指定别名(as) 6.6 去重查询(distinct) 6.7 对查询结果进行排序(order by) 6.8 条件查询(where) 6.9 分页查询(limit) 7. 修改表中的数据 8. 删除表中的数据 前言: 库名.表名.列名等等不能和关键字相同,如

  • hive函数简介

    首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析. 2.Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提

  • 一文了解Hive是什么

    目录 一.Hive介绍 Hive的优缺点 Hive架构 Hive用户接口 Hive元数据的三种存储模式 Hive数据存储 架构原理 Hive文件格式 Hive本质 Hive工作原理 Hive数据类型 一.Hive介绍 hive: 由 Facebook 开源用于解决海量结构化日志的数据统计工具. Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能. Hive的优缺点 优点: 类似于SQL语句,简单学习易上手 避免了去写 MapRedu

  • MySQL数据库存储引擎和分支现状分析

    MySQL随着相应的各主创和内部开发人员的离去,缔造了各个不同的引擎和分支,让MySQL有希望继续发扬光大起来. 在MySQL经历了2008年Sun的收购和2009年Oracle收购Sun的过程中,基本处于停滞发展的情况,在可以预见的未来,MySQL是肯定会被Oracle搁置并且逐步雪藏消灭掉的.MySQL随着相应的各主创和内部开发人员的离去,缔造了各个不同的引擎和分支,让MySQL有希望继续发扬光大起来. 本文大致讲解一下MySQL目前除了主要的 MyISAM.InnoDB.Heap(Memo

  • 说说大型高并发高负载网站的系统架构

    我在Cernet做过拨号接入平台的搭建,而后在Yahoo3721负载搜索引擎前端平台开发,又在猫扑处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大型网站应对高负载和并发的解决方案上有一些积累和经验,可以和大家一起探讨一下. 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经

  • Python实现批量读取图片并存入mongodb数据库的方法示例

    本文实例讲述了Python实现批量读取图片并存入mongodb数据库的方法.分享给大家供大家参考,具体如下: 我的图片放在E:\image\中,然后使用python将图片读取然后,显示一张,存入取一张(可以注释掉显示图片的语句),通过Gridfs的方式存入图片.代码如下: # --* coding=utf-8 *-- from cStringIO import StringIO from pymongo import MongoClient import gridfs import os imp

  • Python实现将数据框数据写入mongodb及mysql数据库的方法

    本文实例讲述了Python实现将数据框数据写入mongodb及mysql数据库的方法.分享给大家供大家参考,具体如下: 主要内容: 1.数据框数据写入mongdb方法 2.数据框数据写入mysql方法 为了以后不重复造轮子,这里总结下,如何把数据框数据写入mysql和mongodb的方法记录下来,省得翻来翻去.下面记录的都是精华. 写入mongodb代码片段(使用pymongo库): ##########################写入mongodb 数据库#################

  • 数据库分库分表是什么,什么情况下需要用分库分表

    数据量在什么情况下需要分表? 为了保证数据库的查询效率,当数据达成一定量时建议进行分表操作 1.oracle 当oracle单表的数据量大于2000万行时,建议进行水平分拆. 2.mysql 当mysql单表的数据量大于1000万行时,建议进行水平分拆. 单表容量到了1000W以上基本上稍微复杂一点的SQL都需要仔细优化,这时候的SQL耗时主要集中在磁盘IO上,数据命令缓存的概率降低,总之不好搞,如果是正常的互联网项目,提前分库分表,在前期能做的先做了,后面会省很多时间处理数据迁移的事情,数据操

随机推荐