文章目录
一、数据仓库
1.1、数据仓库概念
- 数据仓库,中文简称数仓。英文叫做Data WareHouse,简称DW。
- 数据仓库是面向分析的集成化数据平台,分析的结果给企业提供决策支持;
- 数据仓库本身不生产数据;
其分析的数据来自于企业各种数据源。
企业中常见的数据源:
RDBMS关系型数据库--->业务数据
log file----->日志文件数据
爬虫数据
其他数据
- 数据仓库本身也不消费数据;
其分析的结果给外部各种数据应用(Data application)来使用。
Data visualization(DV)数据可视化
Data Report 数据报表
Data Mining(DM) 数据挖掘
Ad-Hoc 即席查询
即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询条件的。
- 企业中一般先有数据库,然后有数据仓库,可以没有数据仓库,但是不能没有数据库。
- 企业刚刚起步时,必须有业务数据库,生成业务数据
- 当业务数据达到一定体量才需要数据仓库进行统一数据分析
- 数据仓库不是大型的数据库,只是一个数据分析的平台。
1.2、数据仓库核心特征
- 面向主题性(Subject-Oriented)
主题(subject)是一个抽象的概念 数据综合体。一个分析的主题可以对应多个数据源。
在数仓中开展分析,首先确定分析的主题,然后基于主题寻找、采集跟主题相关的数据。 - 集成性(Integrated)
数仓不是生成数据的平台 其数据来自于各个不同的数据源
当我们确定主题之后 就需要把和主题相关的数据从各个数据源集成过来。
因为同一个主题的数据可能来自不同的数据源 它们之间会存在着差异(异构数据):字段同名不统一、单位不统一、编码不统一;
因此在集成的过程中需要进行ETL(Extract抽取 Transform转换 load加载) - 不可更新性(Non-Volatile)
数仓上面的数据几乎没有修改操作,都是分析的操作。
数仓是分析数据规律的平台 不是创造数据规律的平台。
注意:数据之间的规律不能修改。 - 时变性(Time-Variant)
数仓是一个持续维护建设的东西。
站在时间的角度,数仓的数据成批次变化更新。一天一分析(T+1) 一周一分析(T+7)
上述所讲的更多偏向于离线数仓,当下还有比较火的实时数仓。
1.3、数据库和数据仓库的区别
- 本质的区别就是OLTP 和OLAP系统的区别
- 数据库更偏重于事务处理,要求其支持事务,增删改查效率较高
- 事务: 最小业务单元, 在执行过程中,要么全部成功,要么全部失败
- 举例:小椭圆给小绿转账1000元,银行系统需要给小椭圆减少1000元, 给小绿增加一千元,要么同时成功,要么同时失败
- 事务: 最小业务单元, 在执行过程中,要么全部成功,要么全部失败
- 数据仓库偏重于数据吞吐量和稳定,不要求支持事务,不要求较高的响应效率,但必须可以处理海量数据或文件
- 数据库更偏重于事务处理,要求其支持事务,增删改查效率较高
- OLTP(On-Line Transaction Processing)
Transaction 事务 面向事务支持事务
OLTP系统注重的是数据安全、完整、响应效率。通常指的就是RDBMS关系型数据库。
#面向事务 支持事务
#RDBMS: MySQL ORACLE
#注意 不是NoSQL数据库 没有事务支持: Redis HBase
- OLAP(On-Line Analytical Processing) 中文发音:欧莱普
Analytical 分析 面向分析支持分析
OLAP更注重的是数据吞吐量
主要指的是数据仓库、数据集市(小型数据仓库):Apache Hive、Apache Impala
- 注意:在某些场合下,说ORACLE也是OLAP系统,如何理解?
如果把RDBMS只用作数据分析工作,就是OLAP系统。
关系型数据库只要从事的是数据分析的工作,就可以看做是OLAP系统
但是Hive不可以作为OLTP使用因为其不具备事务功能.
- 数据仓库不是大型的数据库,也没有要取代数据库的目标,只是一个数据分析的平台。
1.4、数据仓库分层架构[重要]
- 数仓本身不生产数据也不消费数据,按照数据流入流出的特点,对平台进行分层
- 最基础最核心的3层架构,企业实际应用中,可以结合需要添加不同分层。
- 核心3层架构
- ODS 操作型数据层、源数据层、临时存储层
- 直接抽取源数据,数据的异常值,缺失值,数据的单位等都有问题,无法用于数据分析
- ODS 操作型数据层、源数据层、临时存储层
其数据来自于各个不同的数据源 临时存储 和数据源解耦合之间有差异一般不直接用于分析
- DW 数据仓库(大数据开发工程师一般都是在该层进行各种操作)
其数据来自于ODS经过层层的ETL变成各种模型的数据.数据干净.规则统一
基于各种模型开展各种分析
企业中根据业务复杂度 继续在DW中继续划分子层。 存储大量的中间结果。其数据来自于ODS经过层层ETL得出 企业中可以根据需求在DW中继续分层。
- DA 数据应用层
最终消费DW数据的各种应用。
- 分层好处
- 解耦合(相互依赖),方便协同开发
- 可以追根溯源,更快对于问题进行解决和修复
- 过程中创建的中间表可以重复利用
- 空间换时间 提高最终应用层使用数据的效率
1.5、ETL和ELT
E: 数据抽取 将多个数据源中的数据抽取到临时存储空间(内存, 磁盘)
T: 数据转换 将数据进行清洗或转换,使其干净统一,满足数据分析的使用要求
L: 数据加载 将数据加载到数据仓库中,待其他业务部门使用.
ETL: 先将数据抽取到临时位置或者内存中,进行数据转换处理,最终结果加载到数仓
- 在传统数仓中,ETL用的多,因为业务相对简单,变化小,或不变化,或者数据体量较小
ELT: 先将数据抽取出来,加载到数仓中,在数仓中进行进一步的转换处理 - 在现阶段绝大多数公司都是ELT,便于数仓分层,更适合处理灵活多变的数据需求
二、Apache Hive
2.1、Hive的概念
- Hive是Facebook开源出来,后来贡献给力Apache .宗旨是:提高分析数据的能力降低分析数据的开发成本。
- Hive是基于 Hadoop 的一个**数据仓库**工具,用于分析数据的。
- hadoop具备数据存储和计算的能力,理论上可以作为一个数据仓库使用,但是不合适
- hadoop中的mr任务处理结构化数据过于复杂,代码量巨大,且开发效率不高,容易出错
- Hive解决了mr任务的这种缺陷,让我们使用类似于sql语句的方式进行结构化数据的增删改查操作
为什么说Hive是基于Hadoop的呢?
#作为一款数据仓库软件,应该要具备哪些能力?
具备存储数据的能力
具备分析数据的能力
Hive作为数仓软件,当然具备上述两种能力?
#Hive使用Hadoop HDFS作为数据存储系统
#Hive使用Hadoop MapReduce来分析数据
基于此说Hive是基于Hadoop的数仓软件。
总结:
hive是一个数仓管理工具,是基于hadoop的数仓软件
hive既不负责数据的存储,也不负责数据的计算.
hive的作用:
- hive可以将结构化数据映射为表
- hive提供了一种类似于sql的查询语句
- hive可以将sql语句转换为mr任务并执行
hive极大程度上提高了数据仓库的开发效率,降低了数仓的使用门槛
什么是结构化数据?
可以通过行索引和列索引定位一个数据的数据结构,类似于excel表数据或则sql数据库数据
结构化数据:1, 小明, 12 2, 小芳, 15 3, 小绿, 22
表:
学号 姓名 年龄 1 小明 12 2 小芳 15 3 小绿 22 结构化数据映射表时需要提取hive中的元数据.
2.2、Hive的架构组件(非常重要)
- 客户端用户接口
所谓的客户端指的是给用户一种方式编写Hive SQL
目前常见的客户端:CLI(命令行接口 shell)、Web UI、JDBC|ODBC
- Hive Driver驱动程序
hive的核心
完成从接受HQL到编译成为MR程序的过程。
sql解释 编译 校验 优化 制定计划
- metadata
元数据存储。 描述性数据。
对于hive来说,元数据指的是表和文件之间的映射关系。
- Hadoop
HDFS 存储文件
MapReduce 计算数据
YARN 程序运行的资源分配
- Q:Hive是分布式的软件吗?
Hive不是分布式软件。只需要在一台机器上部署Hive服务即可;
Hive的分布式处理能力是借于Hadoop完成的。HDFS分布式存储 MapReduce分布式计算。
hive不是分布式软件,但是可以借助hadoop完成分布式的存储和计算任务
总结: 其实hive的架构一共就三大部分: 客户端 驱动程序 元数据服务
2.3、Hive和Mysql的区别
- 从外表、形式模型、语法各层面上看 ,hive和数据库(Mysql)很类似。
- 底层应用场景是完全不一样的。
- hive属于olap系统是面向分析的侧重于数据分析(select)
- 数据库属于oltp系统是面向事务的侧重于数据时间交互(CRUD)
- Hive绝不是大型数据库也不是为了要取代MySQL这样的数据库。
三、Hive安装
3.1、Metadata、metastore
回顾: hdfs的元数据
元数据: 描述数据的数据
hdfs中存储一个文件,文件中的数据内容就是我们想要获取的内容.
如果想要获取这个内容,我们就需要知道这个文件的相关描述信息
例如: 路径,大小,创建修改时间,名称,block块的数量, 位置 …
# Metadata 元数据
对于hive来说,元数据主要指的是表和文件之间的映射关系。
元数据也是数据,存储在哪里呢?Hive当下支持两种地方存储元数据。
1、存储在Hive内置的RDBSM中,Apache Derby(内存级别轻量级关系型数据库)
Derby数据库主要是为了让程序员测试hive的执行使用,正常开发中不会使用该数据库
2、存储在外界第三方的RDBMS中,比如:MySQL。 企业中常用的方式。
# metastore 元数据访问服务
专门用于操作访问metadata的一种服务,对外暴露服务地址给各个不同的客户端使用访问Hive的元数据。
并且某种程度上保证了metadata的安全。
思考:hive中的元数据都包含什么?
hive中我们使用元数据构建表,用来描述结构化数据,就是结构化数据的映射.
库名,表名, 字段名, 字段类型, 数据存储位置…
hive映射的过程,就是使用元数据建表,通过元数据存储的数据位置,从hdfs中获取数据,依次填写到表中,形成表数据,再使用sql语句进行查询.
思考:hive为什么不将元数据存储在hdfs中呢?
hive进行元数据管理时,我们需要快速创建表结构,并且频繁进行元数据的增删改查, hdfs中的数据不支持随机修改.且增删改的效率较低,不适合作为hive的元数据存储服务出现
3.2、Hive的安装部署模式
-
如何区别,关键在于两个问题?
- metadata元数据是存储在哪里的? 内置derby还是外置的Mysql。
- metastore服务是否需要单独配置,单独手动启动?
-
内嵌模式(体验)
1、元数据存储在内置的derby 2、不需要单独配置metastore 也不需要单独启动metastore服务 安装包解压即可使用。 适合测试体验。实际生产中没人用。适合单机单人使用。
- 本地模式(测试)
1、元数据使用外置的RDBMS,常见使用最多的是MySQL。 2、不需要单独配置metastore 也不需要单独启动metastore服务 缺点: 如果使用多个客户端进行访问,就需要有多个Hiveserver服务,此时会启动多个Metastore 有可能出现资源竞争现象
- 远程模式(开发) 知道就可以了
1、元数据使用外置的RDBMS,常见使用最多的是MySQL。
2、metastore服务单独配置 单独手动启动 全局唯一。
这样的话各个客户端只能通过这一个metastore服务访问Hive.
企业生产环境中使用的模式,支持多客户端远程并发操作访问Hive.
- 对比
metadata存储在哪 metastore服务如何 内嵌模式 Derby 不需要配置启动 本地模式 MySQL 不需要配置启动 远程模式 MySQL 单独配置、单独启动
3.3、Hive的远程模式部署安装
3.3.1、安装Hadoop
启动hive之前,需要保证Hadoop启动且服务正常可用。
1、等待安全模式结束启动Hive
2、在Hadoop中设置用户代理,注意3台机器都需要修改,重启生效
vim etc/hadoop/core-site.xml
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
3.3.2、安装MySQL
主要考虑的就是MySQL Hive版本的兼容性 和jdbc驱动版本
在Centos7环境下如何安装MySQL
仅在node1中安装了mysql所以我们选择node1进行hive的安装
3.3.3、安装Hive (选择node1安装)
#apache-hive-3.1.2-bin.tar.gz
上传到/export/software 解压到 /export/server
cd /export/software
tar -zxvf apache-hive-3.1.2-bin.tar.gz -C ../server
- 0、解决Hive与Hadoop之间guava版本差异
cd /export/server/apache-hive-3.1.2-bin/
rm -rf lib/guava-19.0.jar
cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
- 1、hive-env.sh
cd /export/server/apache-hive-3.1.2-bin/conf
mv hive-env.sh.template hive-env.sh
vim hive-env.sh
export HADOOP_HOME=/export/server/hadoop-3.3.0
export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib
- 2、hive-site.xml
vim hive-site.xml
<configuration>
<!-- 存储元数据mysql相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</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>
<!-- H2S运行绑定host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
</property>
<!-- 远程模式部署metastore metastore地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
<!-- 关闭元数据存储授权 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
</configuration>
- 3、上传Mysql jdbc驱动到Hive安装包的Lib目录下
mysql-connector-java-5.1.32.jar
- 4、手动执行命令初始化Hive的元数据
cd /export/server/apache-hive-3.1.2-bin/
bin/schematool -initSchema -dbType mysql -verbos
# 初始化成功会在mysql中创建74张表
- 5、在hdfs创建hive存储目录
- 默认情况下,会将hive中的数据存储在该位置,修改权限是因为我们希望可以任意在该文件中读写信息
- 默认情况下,会将hive中的数据存储在该位置,修改权限是因为我们希望可以任意在该文件中读写信息
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
四、Hive 服务的启动[重要]
4.1、metastore服务
- 前台启动
#前台启动
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
#前台启动开启debug日志
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console
#前台启动关闭方式 ctrl+c结束进程
- 后台挂起启动
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
#后台挂起启动 结束进程
使用jps查看进程 使用kill -9 杀死进程
#nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下
注意: 日志文件存储在启动该服务时使用的工作目录中的 nohup.out文件下的.
- 添加hive的环境变量
vim /etc/profile
# 在文件末尾添加如下内容
#HIVE_HOME
export HIVE_HOME=/export/server/hive
export PATH=$PATH:$HIVE_HOME/bin
- 加载环境变量
source /etc/profile
- 启动hive服务
# 前台启动
hive --service metastore
# 后台启动
nohup hive --service metastore &
4.2、Hive的客户端
- Hive的第一代客户端
-
bin/hive
-
直接访问metastore服务
-
如果需要使用hive服务访问元数据服务,只需要在配置文件中书写元数据服务访问路径即可
- hive元数据服务的端口号默认是9083
-
配置
<configuration> <property> <name>hive.metastore.uris</name> <value>thrift://node1:9083</value> </property> </configuration>
-
弊端:
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.第一代客户端属于shell脚本客户端 性能友好安全方面存在不足 Hive已经不推荐使用 官方建议使用第二代客户端beeline
-
- Hive的第二代客户端
- bin/beeline
- 无法访问metastore服务,只能够访问Hiveserver2服务。
- beeline客户端,需要先连接服务,再使用服务
- 使用
# 拷贝node1上 hive安装包到beeline客户端机器上(node3) scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/ #1、在安装hive的服务器上 首先启动metastore服务 再启动hiveserver2服务 nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore & nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & #2、在任意机器(如node3)上使用beeline客户端访问 [root@node3 ~]# /export/server/apache-hive-3.1.2-bin/bin/beeline beeline> ! connect jdbc:hive2://node1:10000 #jdbc访问HS2服务 Connecting to jdbc:hive2://node1:10000 Enter username for jdbc:hive2://node1:10000: root #用户名 要求具备HDFS读写权限 Enter password for jdbc:hive2://node1:10000: #密码可以没有
- 注意: hiveserver2服务启动后无法立即使用类似于hdfs的安全模式,大概要半分钟到一分钟才能开始使用.
- 注意: 所有通过jdbc连接hive的第三方服务,连接的端口号都是10000,也就是只有第二代客户端才可以使用第三方服务连接
查询10000端口是否被绑定的方法
lsof -i:10000
五、Hive初体验
- 体验目标:在hive中如何才能够将一份结构化的数据文件 映射成为一张表 然后使用SQL分析?
--结构化文件 1,allen,18 2,james,24 3,anna,45 --在hive中建表 create table t_1(id int,name string,age int);
-
猜想1:只要在hive中创建表,那么在HDFS就会有一个文件夹与之对应。
-
难道把结构化文件放置在这个目录下,才能映射成功吗? 不一定
/user/hive/warehouse/test_db.db/t_1 hadoop fs -put 1.txt /user/hive/warehouse/test_db.db/t_1
-
猜想2:难道要指定分隔符? 不一定
create table t_1(id int,name string,age int); create table t_2(id int,name string,age int) row format delimited fields terminated by ','; --指定分隔符为逗号
-
猜想3:建表的时候字段类型要不要和文件中数据保持一致? 一定要保持一致
-
如果不一致,hive会尝试进行转换,但是不保证成功,如果不成功显示null。
create table t_3(id int,name int,age string) row format delimited fields terminated by ','; +---------+-----------+----------+--+ | t_3.id | t_3.name | t_3.age | +---------+-----------+----------+--+ | 1 | NULL | 18 | | 2 | NULL | 24 | | 3 | NULL | 45 | +---------+-----------+----------+--+
-
- 当我们映射成功之后,会如何?
就可以基于表写Hive SQL 开展数据分析,不用写MapReduce。 0: jdbc:hive2://node1:10000> select * from t_2 where age >18; +---------+-----------+----------+--+ | t_2.id | t_2.name | t_2.age | +---------+-----------+----------+--+ | 2 | james | 24 | | 3 | anna | 45 | +---------+-----------+----------+--+ 2 rows selected (0.722 seconds) 0: jdbc:hive2://node1:10000> 0: jdbc:hive2://node1:10000> select count(*) from t_2 where age >18; WARNING: 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. +-----+--+ | c0 | +-----+--+ | 2 | +-----+--+ 1 row selected (67.76 seconds)
总结:
- hive在数据的查询过程中稍慢, 但是写入数据极其缓慢.
- hive数据在创建表时会创建一个目录将数据上传至该目录时可以快速映射为一个表.
- hive中数据如果想要映射成功,需要保证每列的数据类型一致,且分隔符指定正确.
- 在hive终端中或之后书写的hive脚本中不要出现中文(所有的库名,表名,字段名都不要包含中文.)
六、Apache Hive SQL-DDL、DML
DDL : 数据定义语言 (操作表, 操作库, 操作字段) 给数据搭建一个框架,等待数据填入
DML : 数据操作语言 (数据记录的增删改操作) 数据库数据记录的写入操作
DCL : 数据控制语言 (用户权限,表权限,库权限, 事务级别, 数据库相关配置等.) 所有控制,设置数据库的操作方式
DQL : 数据查询语言 (数据的查询操作) 数据库数据记录的读取操作
6.1、 DataGrip连接hive数据仓库
- 点击左上角的加号,选择datasource, 在下拉菜单中,选择Apache Hive
- 填写配置参数并点击下方download下载hive驱动
- 添加驱动完成后点击测试连接,成功后点击ok即可
注意: 如果无法下载驱动可以使用本地驱动
1.点击Apache driver,跳转到驱动设置页面
2.点击加号,进入自定义jar包位置的选择
4. 选择驱动所在位置,点击ok 即可配置本地驱动
5.回到datasource,选择刚才操作的连接,点击测试
测试成功后即可连接完成.
检测连接是否成功的方法: 查看数据连接中是否可以正确显示数据仓库的名称.
6.2、Hive SQL
6.2.1、Hive数据类型
- Hive除了支持SQL类型之外,还支持java数据类型;(string)
- Hive除了支持基础数据类型之外,还支持复合类型(array数组 map映射);
- array就是一个数据容器,内部存储了多个相同数据类型的数据值 [‘坤坤’, ‘程程’,‘史史’]
- map也是一个数据容器,内部存储了多个数据的键值对信息 {‘name’:‘宝强’, ‘age’: 18}
- 针对复合类型的数据要想直接从文件中解析成功 还必须配合分隔符指定的语法。
- Hive中大小写不敏感;
- 在建表的时候,最好表的字段类型要和文件中的类型保持一致,
- 文件中的数据类型是什么? 文件中都是字符串类型数据,其实说数据类型一致是和源数据的数据类型一致
- 举例:上述文件是从mysql中提取出来的,则保证mysql中的数据类型和hive中一致
- 在开发中如果数据类型不确定或者数据类型复杂,在hive建表阶段就把数据类型写成string类型,在使用时再进行数据类型转换
- 如果不一致,Hive会尝试进行类型隐式转换,不保证转换成功,如果不成功,显示null;
- 文件中的数据类型是什么? 文件中都是字符串类型数据,其实说数据类型一致是和源数据的数据类型一致
- 常用的数据类型
整数类型: int
浮点型: double
字符串类型: string
布尔型: boolean
复合数据类型:
map: 类似于字典,但是字典中键值对的数据类型要保持一致
array: 类似于列表,但是只能存储相同数据类型的内容
struct: 结构体(偶尔会用到)
在hive中数据都是写在文件中的,所占用的空间大小已经固定,使用哪些数据类型就不那么重要了
6.2.2、建库/表
- 建库
-- 1.创建数据库
-- create database 数据库名称;
create database db_test;
-- 再次创建同名数据库会报错, 所以我们需要增加安全性判断条件 if not exists
create database if not exists db_test;
-- 在hive中 database 和 schema 作用完全一样,记住一个就可以了,但是别人写的时候我们要认识
create schema db_test1;
-- 2. 查看所有的数据库
show databases;
-- 3. 使用数据库
use db_test;
-- 4. 查看当前正在使用的数据库
select current_database();
-- 5. 查看数据库的相关元数据信息
desc database db_test;
-- 6.创建一个数据库指定存储位置
create database db_test2 location '/tmp/test';
desc database db_test2;
-- 7. 删除数据库
drop database db_test;
-- bigdata_db is not empty. One or more tables exist. 非空数据库无法被删除
-- 如果想要删除非空数据库,要使用cascade (慎用)
drop database bigdata_db cascade;
- 建表
-- 1. 创建数据表
-- 格式: create table 表名 (字段信息);
create table test_db.students
(
id int,
name string,
age int
);
-- 2. 如果该数据库中已经有该名称的表,将会报错,所以我们要添加安全性判断 if not exists
create table if not exists test_db.students(
id int,
name string
);
-- 3. 查看数据表相关的元数据信息
desc test_db.students;
-- 4. 查看数据库中全部数据表的名称
show tables in test_db;
-- 5. 清空数据表
-- does not support these operations. 在hive中不支持随机删除
-- delete from test_db.students;
-- 可以使用, 注意 table不能省略
truncate table test_db.students;
-- 6. 删除数据表, 有没有数据都可以删除该表
drop table test_db.students;
drop table test_db.person2;
6.2.3、Hive读写HDFS上文件[重点]
create external(外部表) table if not exists 表名 (
id int,
name string
)
partitioned by name (分区表)
cluster by name sorted by id into num(分桶表)
row format delimited (序列化类型)
fields terminated by ',' (字段分隔符)
collection items terminated by '-' (元素分隔符)
map keys terminated by ':' (键值分隔符)
tblproperties '' 表的属性信息
;
- 机制:SerDe(Serializer and Deserializer)序列化机制(文件读写的规则)
Deserializer: 可以理解为将数据从磁盘中读取到内存中的过程
Serializer :可以理解为将数据从内存中写入到磁盘中的操作
- 读文件
- HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
- hdfs中的文件 >>> 使用输入流对象 >>> 转换为kv结构 >>> 进行反序列化 >>> 转换成数据行对象
#1、使用InputFileFormat(默认实现TextInputFormat)读取hdfs上文件 一行一行读取数据,返回<k,v>键值对类型 #2、返回<key, value>,其中数据存储在value中 #3、使用Deserializer反序列化动作读取value 解析成为对象(Row object) 默认的序列化类LazysimpleSerDe
- 写文件
- Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files
- 数据行对象>>> 序列化操作 >>> 转化kv结构的二进制数据 >>> 使用输出流对象 >>> 写入hdfs文件中
- hive中默认的序列化机制叫做LazySimpleSerDe
- 在默认序列化机制中可以指定各种分隔符,以便于对于数据进行映射
- 在开发中绝大多数情况下使用的都是默认的序列化机制
- 分隔符指定语法
- 语法格式
ROW FORMAT DELIMITED | SERDE ROW FORMAT DELIMITED 表示使用LazySimpleSerDe类进行序列化解析数据 ROW FORMAT SERDE 表示使用其他SerDe类进行序列化解析数据
- ROW FORMAT DELIMITED具体的子语法
row format delimited [fields terminated by char] #指定字段之间的分隔符 [collection items terminated by char] #指定集合元素之间的分隔符 [map keys terminated by char] #指定map类型kv之间的分隔符 [lines terminated by char] #指定换行符
- 语法格式
- 默认分隔符
- Hive在建表的时候,如果没有row format语法,则该表使用==\001默认分隔符==进行字段分割;
- 如果此时文件中的数据字段之间的分隔符也是\001 ,那么就可以直接映射成功。
- 针对默认分隔符,其是一个不可见分隔符,在代码层面是\001表示
- 在实际工作中,Hive最喜欢的就是\001分隔符,在清洗数据的时候,有意识的把数据之间的分隔符指定为\001;
- \001的好处.这个字符ascii码中的第一个字符,占用空间小, \001在生产生活中的数据记录中绝不可能出现
- 例子
-- 创建一个test_db数据库 create database test_db; -- 创建一个数据表 create table test_db.t_archer( id int comment "ID", name string comment "英雄名称", hp_max int comment "最大生命", mp_max int comment "最大法力", attack_max int comment "最高物攻", defense_max int comment "最大物防", attack_range string comment "攻击范围", role_main string comment "主要定位", role_assist string comment "次要定位" ) comment "王者荣耀射手信息"; -- 将数据文件全部上传至node1的/root/hive_data目录中 -- 将数据上传到hdfs中 -- hadoop fs -put archer.txt /user/hive/warehouse/test_db.db/t_archer -- 查看表中数据是否插入成功, 数据插入成功,但是映射出正确数据 select * from test_db.t_archer; -- 数据没有映射成功,数据内容全部为null,此处就要使用serde机制进行分隔符指定 create table test_db.t_archer1( id int comment "ID", name string comment "英雄名称", hp_max int comment "最大生命", mp_max int comment