Hadoop和Hive

目录

1.概念

2.Hadoop各个文件夹

3.六个配置文件的作用 etc/hadoop

3.1 core-site.xml

3.2 hdfs-site.xml

3.3 yarn-site.xml

3.4 mapred-site.xml

4.Hadoop命令

5.数据存储HDFS

5.1作用:

5.2 HDFS的架构(主从架构)

主节点NameNode:

从节点DataNode:

secondarynamenode:

5.3 HDFS拷贝文件的流程

5.4 HDFS的Web界面

5.5 BLock存储

5.6 HDFS常用的shell命令

5.7 副本机制

6.数据计算Mapreduce

6.1 map阶段

6.2 shuffle阶段

6.3 reduce阶段

6.4 使用Java处理Mapreduce流程

编写mapper(业务逻辑)

编写reducer(业务逻辑)

编写driver(任务的提交执行)

打包(xxx.jar)提交到集群去运行

6.5 词频统计案例

7.任务调度Yarn

7.1 调度策略

FIFO

容量调度

公平调度

设置调度文件的方法

7.2 架构

8.Hive

8.1什么是Hive

8.2 Hive 架构 

8.3 Hive与Hadoop与 MySQL的关系

Hive利用HDFS存储数据,利用MySQL存储元数据,利用MapReduce查询分析数据

元数据存储在MetaStore数据库中

​元数据(表名,字段名,字段类型... ):

MySQL中Hive数据库相关的元数据表

DBS表中存储Hive中所有数据库的基本信息。

 如何在hdfs上找到hive数据库的路径?

TBLS表中存储Hive中所有数据表的基本信息。

TBLS表中存储Hive中所有分区表的分区字段信息。

8.4 访问 Hive 的三种模式和Hive的登录方式

内嵌式 

本地模式访问 

远程模式访问 [项目组默认的方式]

Hive登录方式

​8.5 HQL语法

8.6 Hive的数据类型

基本数据类型

复杂数据类型

8.7 基本类型建表的过程

建表

添加数据(数据上传的四种方式)

查询数据

8.8 复杂类型建表的过程

建表

添加数据

查询

8.9 复杂数据类型的数据访问

array

map类型

struct类型

8.10 Hive中的表类型 

内部表(Internal Table)

外部表

一级分区表(本质上是Hive的优化手段)

例题 将EMP表中部分数据插入Hive,并以deptno为分区字段建立分区表

多级分区表

动态分区表

分桶表

数据分桶的定义

数据分桶的意义

实现分桶的步骤

Hive 分区表与分桶表的异同点


1.概念

Hadoop 框架是用于计算机集群大数据处理的框架,所以它必须是一个可以部署在多台计算机上的软件。部署了 Hadoop 软件的主机之间通过套接字 (网络) 进行通讯。

Hadoop 主要包含 HDFS 和 MapReduce 两大组件,HDFS 负责分布储存数据,MapReduce 负责对数据进行映射、规约处理,并汇总处理结果。

Hadoop 框架最根本的原理就是利用大量的计算机同时运算来加快大量数据的处理速度。例如,一个搜索引擎公司要从上万亿条没有进行规约的数据中筛选和归纳热门词汇就需要组织大量的计算机组成集群来处理这些信息。如果使用传统数据库来处理这些信息的话,那将会花费很长的时间和很大的处理空间来处理数据,这个量级对于任何单计算机来说都变得难以实现,主要难度在于组织大量的硬件并高速地集成为一个计算机,即使成功实现也会产生昂贵的维护成本。

Hadoop 可以在多达几千台廉价的量产计算机上运行,并把它们组织为一个计算机集群。

一个 Hadoop 集群可以高效地储存数据、分配处理任务,这样会有很多好处。首先可以降低计算机的建造和维护成本,其次,一旦任何一个计算机出现了硬件故障,不会对整个计算机系统造成致命的影响,因为面向应用层开发的集群框架本身就必须假定计算机会出故障。

2.Hadoop各个文件夹

bin:Hadoop最基本的管理脚本和使用脚本的目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop。

etc:Hadoop配置文件所在的目录,

include:对外提供的编程库头文件(具体动态库和静态库在lib目录中),这些头文件均是用C++定义的,通常用于C++程序访问HDFS或者编写MapReduce程序。

lib:该目录包含了Hadoop对外提供的编程动态库和静态库,与include目录中的头文件结合使用。

libexec: 各个服务对用的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息。

sbin: Hadoop管理脚本所在的目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本。

share: Hadoop各个模块编译后的jar包所在的目录,官方自带示例。

3.六个配置文件的作用 etc/hadoop

配置文件的名称    作用
core-site.xml    核心配置文件,主要定义了我们文件访问的格式 hdfs://
hadoop-env.sh    主要配置我们的java路径
hdfs-site.xml    主要定义配置我们的hdfs的相关配置
mapred-site.xml    主要定义我们的mapreduce相关的一些配置
slaves    控制我们的从节点在哪里 datanode nodemanager在哪些机器上
yarm-site.xml    配置我们的resourcemanager资源调度 

3.1 core-site.xml

<property>
    <name>fs.defaultFS</name> 
    <value>hdfs://node1:8020</value> 
//访问HDFS的默认路径 Hadoop大部分任务都在node1上运行
</property>

<property> 
    <name>hadoop.tmp.dir</name>
    <value>/opt/data/hadoop-3.3.0</value>
//存放Hadoop文件的目录
</property>

<!-- 设置HDFS web UI用户身份 -->
<property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
</property>

<!-- 整合hive -->
<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>

<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

3.2 hdfs-site.xml

<property>
 	<name>dfs.namenode.secondary.http-address</name>
  	<value>node2:50090</value>
//secondary的地址
</property>
<property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>

3.3 yarn-site.xml

<!-- 指定YARN的主角色(ResourceManager)的地址 -->
<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>node1</value>
</property>
	
<!-- NodeManager上运行的附属服务  需配置成mapreduce_shuffle 才可运行MapReduce程序默认值:"" -->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

<!-- 是否将对容器实施物理内存限制 -->
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>

<!-- 是否将对容器实施虚拟内存限制。 -->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>
<!-- 开启日志聚集 -->
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>

<!-- 设置yarn历史服务器地址 -->
<property>
    <name>yarn.log.server.url</name>
    <value>http://node1:19888/jobhistory/logs</value>
</property>

<!-- 保存的时间7天 -->
<property>
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>604800</value>
</property>

3.4 mapred-site.xml

<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>

<!-- mapreduce程序历史服务器地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>node1:10020</value>
</property>

<!-- 历史服务器web地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>node1:19888</value>
</property>


<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

4.Hadoop命令

查看关于java的进程

jps

格式化命令 :

hadoop namenode -format


启动命令 :

start-all.sh


停止命令 : 

stop-all.sh


Hdfs : (其实就是打开hadoop 先进入Hadoop目录,再执行以下命令:)

启动命令 :

start-dfs.sh 

停止命令:

stop-dfs.sh


yarn:

启动命令:

 start-yarn.sh 

停止命令:

 stop-yarn.sh


MySql :

启动命令:

mysql -u root -p


启动hive

hive

5.数据存储HDFS

HDFS概述、HDFS架构、Block存 储、HDFS API使用_hdfs block-CSDN博客

分布式文件管理系统

5.1作用:

管理数据,支持数据的增删改查

5.2 HDFS的架构(主从架构)

主节点NameNode

  • 负责管理HDFS中元数据信息(数据存储的位置, 数据的Block块位置信息,权限相关等内容)

NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表,接收用户的操作请求。

        datanode由Block 构成
                block : 数据块(hadoop3中一个block是 128M) 
                每一个block 都有一个blockid(方便查找)

文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件,namenode启动后一些新增元信息日志。
fstime:保存最近一次checkpoint 的时间

HDFS:Edits和Fsimage详解与合并流程 - 知乎

  • 负责接受并处理客户端的读写请求
  • 管理DataNode(namenode要和datanode通信)

从节点DataNode

  • 负责文件存储(真实的数据)
  • 负责数据的读写请求,保持和namenode通信

secondarynamenode:

  • 辅助namenode合并fsimage和edit文件

5.3 HDFS拷贝文件的流程

5.4 HDFS的Web界面

进入方式

node1的ip:9870


master:9000 表示是HDFS的API端口 JAVA
Safemode is off. 表示当前的安全模式是出于关闭状态,当状态是ON时,整个HDFS不能对外提供任何服务
DFS Remaining: 59.9 GB (82.4%) 表示当前HDFS可以存储的数据量大小为59.9GB
Datanode 表示是数据节点,也是HDFS中的从节点名称为DataNode 该进程主要用来保存具体数据
Browse the fileSystem 可以查看当前文件系统中的内容 / 作为其根路径
logs可以查看HDFS的执行日志

5.5 BLock存储

HDFS Block块大小限定依据及原则_hdfs block size-CSDN博客

DataNode为整个集群提供真实文件数据的存储服务,同时管理本节点中所有Block块

什么是Block块?
文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。2.0以后HDFS默认Block大小是128MB,可以在hdfs-site.xml中dfs.blocksize属性配置Block块

客户端从HDFS中读取数据时,会根据就近原则(根据网络拓扑结构) 选择最近的DataNode下载对应的BLock块


BLock块分布:
HDFS存储数据时,会根据机架感知,如果副本数为3,其中两份数据会被存放在一个节点中,另外一份数据会单独存放,为了防止单个机架出现故障,导致数据丢失。

为什么这样做?
当每个机架上存储一份数据,那么数据会分的过于分散,在后期做数据处理时,会将处理后的数据,进行做数据的汇总,这样机架和机架之间的网络通信会非常频繁,导致大量网络IO 降低执行效率


根据文件的BlockID查询存储路径

find / -name *BlockID*

5.6 HDFS常用的shell命令

操作HDFS集群的前置命令

hadoop fs -(hadoop1.0版本)

hdfs dfs -(hadoop2.0之后)


创建文件夹

hdfs dfs -mkdir 目录

hdfs dfs -mkdir -p 目录       //父目录不存在(首先会创建父目录)


上传文件

hadoop fs -copyFromLocal centos中的文件名 /(hdfs的绝对路径)

hadoop fs -put 文件名 /目录


查看文件内容

hadoop fs -cat /目录/文件名


递归修改文件/文件夹的权限

hadoop fs -chmod -R /目录


从hdfs下载文件到虚拟机

hadoop fs -get /目录/文件名 /opt/


计算指定路径下的目录数量 文件数量以及文件大小(以字节为单位)

hadoop fs -count 


查看指定路径所有文件夹大小

hadoop fs -du /zy70


查看指定目录下内容

hdfs dfs -ls -R  /目录       //显示目录结构
hdfs dfs -ls -d  /目录          //返回的是path
hdfs dfs -ls -h  /目录         //h指的是“human-readable”,按照人性化的单位显示文件大

 


新建文件

hdfs dfs -touchz /目录

hdfs dfs -touch /目录

如果文件已经存在,hdfs dfs -touch命令会更新文件的访问和修改时间

而hdfs dfs -touchz命令不会更新文件的访问和修改时间


将本地文件移动到HDFS

使用这个命令,本地文件会被删除,移到了hdfs上

hdfs dfs -moveFromLocal /本地目录 /hdfs目录


删除hadoop上指定文件或目录

hdfs dfs -rm [-f] [-r] /目录或文

-f:如果要删除的文件不存在,不显示错误信息。
-r/R:级联删除目录下的所有文件和子目录文件。


将hadoop上某个文件或目录重命名

hdfs dfs –mv  /原名  /新名   


HDFS中的文件复制

hdfs dfs -cp [-f] [-p | -p[topax]] [本地目录] [hdfs目录]

-f:如果目录文件存在,将强行覆盖。
-p:将保存文件的属性。


HDFS中的文件合并后下载到本地

hdfs dfs -getmerge [-nl] [hdfs文件目录] [本地目录]


将正在运行的hadoop作业kill掉

hadoop job –kill  [job-id]

安全模式
安全模式(Safemode)是HDFS所处的一种特殊状态。处于这种状态时,HDFS只接受读数据请求,不能对文件进行写、删除等操作。
查看当前状态

hdfs dfsadmin -safemode get

进入安全模式

hdfs dfsadmin -safemode enter

强制离开安全模式

hdfs dfsadmin -safemode leave

一直等待,直到安全模式结束

hdfs dfsadmin -safemode wait

查看帮助

hdfs dfs -help 


设置扩展属性

hdfs dfs -setfattr {-n name [-v value] | -x name} <path>

其中,采用hdfs dfs -setfattr -n name [-v value] | -x name 可以设置属性。
采用hdfs dfs -setfattr -x name 可以删除属性。
-n:指定属性名称(设置属性时用)
-v:指定属性值
-x:指定属性的名称(删除属性时用)

获取扩展属性

hdfs dfs -getfattr [-R] {-n name [-v value] | -x name} <path>
-n:指定属性名称
-d:指定dump,即显示所有属性
-e:指encoding,包含text、hex、base64等。 


HDFS管理命令

报告文件系统的基本信息和统计信息

hdfs dfsadmin -report

查看拓扑

hdfs dfsadmin -printTopology

5.7 副本机制

HDFS中通过副本方式保证数据的安全性,并且同一数据的副本是存储在不同节点当中。HDFS默认副本数是三个。可以在hdfs-site.xml的dfs.replication属性中配置对应数量。

6.数据计算Mapreduce

MapReduce基本原理(详解!)_mapreduce工作原理-CSDN博客

6.1 map阶段

拆分数据 每一拆分后的数据都交由一个maptask执行        

6.2 shuffle阶段

分区 排序 溢写磁盘

6.3 reduce阶段

合并

6.4 使用Java处理Mapreduce流程

编写mapper(业务逻辑)

编写reducer(业务逻辑)

编写driver(任务的提交执行)

打包(xxx.jar)提交到集群去运行

6.5 词频统计案例

7.任务调度Yarn

决定任务执行的顺序,并分配对应的资源(CPU+内存)

7.1 调度策略

FIFO

先进先出

容量调度

多队列,每个队列都是FIFO

公平调度

多队列,每个任务数据量越来越少,所需资源也会变少,空闲的资源分配给其他任务,尽可能让每个任务都能执行

设置调度文件的方法

通过配置文件(项目上演示)

7.2 架构


从YARN的架构来看,它由ResourceManager、NodeManager、JobHistoryServer、Containers、Application Master、job、Task、Client组成。


ResourceManager:

处理客户端请求
启动/监控ApplicationMaster
监控NodeManager
资源分配与调度


ApplicationMaster:

为应用程序申请资源,并分配给内部任务
任务调度、监控与容错


NodeManager:

单个节点上的资源管理
处理来自ResourceManger的命令
处理来自ApplicationMaster的命令


Container:

对资源抽象和封装,目的是为了让每个应用程序对应的任务完成执行


JobHistoryServer:

负责查询job运行进度及元数据管理。


job:

是需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。job也可以叫作Application。


task:

一个具体做Mapper或Reducer的独立的工作单元。task运行在NodeManager的Container中。


Client:

一个提交给ResourceManager的一个Application程序。

8.Hive

8.1 什么是Hive

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张 数据库表,并提供类SQL查询功能。 本质是将SQL转换为MapReduce程序。 主要用途:用来做离线数据分析,比直接用MapReduce开发效率更高

拓展:

hive存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序

8.2 Hive 架构 

需要对 Hive 的架构有个大致的印象:

用户接口模块,含CLI、HWI、JDBC、Thrift Server等

用来实现对Hive的访问。CLI是Hive自带的命令行界面;HWI是Hive的一个简单网页界 面;JDBC、ODBC以及Thrift Server可向用户提供进行编程的接口,其中Thrift Server是基于Thrift软件框架开发的,提供Hive的RPC通信接口。


驱动模块(Driver),含编译器、优化器、执行器等

负责把HiveQL语句 转换成一系列MR作业,所有命令和查询都会进入驱动模块,通过该模块的解析变 异,对计算过程进行优化,然后按照指定的步骤执行。


元数据存储模块(Metastore)

这是一个独立的关系型数据库,通常是与MySQL数据库连接后创建的一个MySQL实例,也可以是Hive自带的Derby数据库 实例。此模块主要保存表模式和其他系统元数据,如表的名称、表的列及其属 性、表的分区及其属性、表的属性、表中数据所在位置信息等

hive 自带了一个关系型数据库 derby , 但是后期会使用 MySQL 替换它

8.3 Hive与Hadoop与 MySQL的关系

Hive学习总结(三)之元数据Metastore_hive元数据包括-CSDN博客

Hive利用HDFS存储数据,利用MySQL存储元数据,利用MapReduce查询分析数据

元数据存储在MetaStore数据库中

元数据(表名,字段名,字段类型... ):

元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。

执行:依赖 MAPREDUCE | TEZ | SPARK

MySQL中Hive数据库相关的元数据表

 

DBS表中存储Hive中所有数据库的基本信息。

 如何在hdfs上找到hive数据库的路径?

打开metastore数据库,找到DBS表

DB_LOCATION_URI这个字段就是数据库HDFS路径

在Web页眉可以看到数据库在HDFS中以文件夹的形式存在

TBLS表中存储Hive中所有数据表的基本信息。

PATITIONS表中存储Hive中所有分区表的分区字段信息。

8.4 访问 Hive 的三种模式和Hive的登录方式

内嵌式 

内嵌式访问: 使用的是hive 默认的derby数据库, 这种模式只允许同时一个 客户端访问

本地模式访问 

本地模式访问: 使用的是MySQL来管理hive的元数据, 支持多个用户同时访问,

但是也对外暴漏账号密码

远程模式访问 [项目组默认的方式]

远程模式访问: 使用的是MySQL来管理hive的元数据, 需要开启 metastore 服务

前端开启方式:

/opt/soft/hive/bin/hive --service metastore

退出前端进程:   ctrl+c ctrl+z

后端开启方式

nohup /opt/soft/hive/bin/hive --service metastore &

启动后, 通过jps查看, 是否出现一个runjar 如果出现 说明没有问题(建议搁一分钟左右, 进行二次校验)
注意: 如果失败了, 通过前台启动, 观察启动日志, 看一下是什么问题, 尝试解决

后台如何退出:
通过 jps 查看进程id 然后采用 kill -9 


Hive登录方式

第一代客户端 就是 hive 模式 如何启动:

在shell命令行输入: hive


第二代客户端: beeline

使用beeline方式有个前提: 需要先启动 metastore 服务和 hiveserver2

服务

启动 metastore:

nohup /opt/soft/hive/bin/hive --service metastore &

启动 hiveserver2:

nohup /opt/soft/hive/bin/hive --service hiveserver2 &

如何启动 beeline

第一步:

/opt/soft/hive/bin/beeline

第二步:

beeline> ! connect jdbc:hive2://node1:10000

退出beeline

!quit

8.5 HQL的常用操作

查看数据库


创建并选择数据库


描述数据库


删除数据库


查看数据库下有哪些表

show tables


查看某张表的详细信息
desc  formatted  表名


查看 某种表的建表语句   

show create table 表名  

 


查看某张表的分区信息
show partitions 分区表表名

 


添加分区 
alter table  表名 add partition(分区字段=分区值)


删除分区

有分区字段的数据表,删除数据时要注意分两种情况:

--删除一个分区的数据
alter table table_name drop partition(partiton_name='value')
-- 删除多个分区的数据
alter table table_name drop partition(partiton_name<'value')
alter table table_name drop partition(partiton_name<='value')
alter table table_name drop partition(partiton_name>'value')
alter table table_name drop partition(partiton_name>='value')

 删除分区内部的部分数据,这时使用重写方式对满足条件的分区进行 overweight 操作,并通过 where 来限定需要的信息,未过滤的的信息将被删除,具体代码格式如下:

insert overwrite table table_name partition(partition_name='value') 
select column1,column2,column2 FROM table_name
where partition_name='value' and column2 is not null


修改分区名(不常用)
alter table  表名  partition(分区字段=分区值) rename to partition(分区字段=修改后分区值)


复制表结构    
create table  目标表 like 来源表


清空数据     

truncate  table  表名


删除数据库
    
drop database 数据库名  cascade 

8.6 Hive的数据类型

基本数据类型

关于三种字符串类型

  • STRING,变长,无需最大长度声明,理论上能存储2GB字符;
  • VARCHAR,变长,需要声明最大长度(1到65535之间),例如VARCHAR(100);
  • CHAR,定长,如CHAR(100);

复杂数据类型

见8.8

8.7 基本类型建表的过程

建表


添加数据(数据上传的四种方式)

将一个或多个数据文件put到表中(最常用)

hdfs dfs -put /路径/文件 /uer/hive/warehouse/表名

/uer/hive/warehouse/是数据表在hdfs中的默认路径

表的路径

数据在hdfs中以文件的形式存在

​​​​​​​

所有数据都在第一列,出现这种问题是因为没有添加分隔符

hive建表时可以指定列与列之间的分隔符,如果没有指定分隔符,Hive会使用默认的分隔符


使用load方式加载数据到目标表中(经常用)

在hive命令行中使用

load data [local] inpath '/路径/文件' [into|overwrite into] table 表名

加local:从虚拟机上传文件到表中,路径为虚拟机路径

不加local:从hdfs上传文件,路径为hdfs的路径

加overwrite:覆盖写入,写入文件之前将该表下所有文件删除(相当于清除所有数据,插入新数据)


insert overwrite table select 查询导入(经常用)

工作中几乎都是使用这个方式在数仓各个层次中传递数据


使用insert into语句(这个方式是自己造数据,几乎不用)


查询数据

8.8 复杂类型建表的过程

map 是一种(key-value)键值对类型;
array 是一种数组类型,array 中存放相同类型的数据;
struct 是一种集合类型。

建表之前一定要观察数据

所有复杂类型的元素之间,元素和元素的分隔符必须一样

需要指定

列与列之间的分隔符,

key与value之间的分隔符:

元素与元素之间的分隔符_

建表

create table demo_class(
name string,
score array<int>,
result map<string, int>,
class struct<id:int, grade:string>
)
row format delimited fields terminated by ',' #列分隔符
collection items terminated by '|' #每个map,struct,array 数据之间的分隔符,三种类型的数据统一用一个
map keys terminated by ':' #map 中的key与value的分隔符

表结构


添加数据

vim demo_class

a,90|92,math:90|english:92,1|genius
b,80|60,math:80|english:60,2|excellent
c,50|66,math:50|english:66,3|fighting


查询

8.9 复杂数据类型的数据访问

hive复杂类型数据详解—array,map,struct_hive array-CSDN博客

接 8.8的demo_class表

array

数据访问

语法: A[n]
操作类型: A为array类型,n为int类型
说明:返回数组A中的第n个变量值,数组的起始下标为0


size()函数可以查询数组中元素的个数,下标超过长度返回null 值


array_contains()函数可以查询数组中是否包含某个元素

array_contains(数组名,值)
返回 true 或 false


map类型

数据访问

语法: M[key]
操作类型: M为map类型,key为map中的key值
说明:返回map类型M中key值为指定值的value值

 


获取map中的kv值


通过k获取v

字段[key]


size()函数获取map中键值对的个数


array_contains查询map中是否包含某个键、值

array_contains(map_keys(字段名), 键名)
array_contains(map_values(字段名), 值名)

 

可以当做where 过滤条件,如选取所有result 值为90的数据


struct类型

数据访问

语法: 字段.k
操作类型: 字段数据为struct类型
说明:获取字段的key

 

8.10 Hive中的表类型 

内部表(Internal Table)

语法

create table 表名(字段 属性)

  • 内部表是Hive的一种表类型,它在创建时会在Hive的数据仓库中创建一个表,并将数据存储在Hive管理的位置。
  • 内部表的数据是由Hive自动管理的,当你删除内部表时,Hive也会制除与之关联的数据.
  • 内部表的数据存储位置由Hive定义,并且通常位于HDFS中的指定目录。
  • 内部表适用于需要Hive来管理和维护数据的情况.

外部表

create external table 表名(字段 属性)

  • 外部表也是Hive的一种表类型,它在创建时会在Hive的数据仓库中创建一个表,但数据并不存储在Hive管理的位置。
  • 外部表只是在指定位曾建立了对数据的指针,实际数据仍保留在外部存储系统(如HDFS或S3)。
  • 当你删除外部表时,外部存储系统中的数据不会被删除。
  • 外部表适用于希望在Hive中访问外部数据,但不需要直接管理数据的情况。

 内部表和外部表的区别

用Location关键字建表

LOCATION一般与外部表(EXTERNAL)一起使用。

一般情况下hive元数据默认保存在<hive.metastore.warehouse.dir>中。

EXTERNAL表指向其存储的任何HDFS位置,而不是存储在configuration属性指定的文件夹中hive.metastore.warehouse.dir

hive建表提供localtion的作用在于这种场景:

如果数据已经存在于HDFS上,并且这些数据已经有其他人在使用了,没办法改变数据文件格式和位置,所以这个时候建表,就要使用extend表,并且指定location,这样就可以直接从该位置读取数据。

外部表和内部表的互相转换

ALTER TABLE 表名 SET TBLPROPERTIES('EXTERNAL'='TRUE') 外部表

ALTER TABLE 表名 SET TBLPROPERTIES('EXTERNAL'='FALSE') 内部表

一级分区表(本质上是Hive的优化手段)

方式1

创建分区表

partitioned by(分区字段 字段类型)

 分区字段不能是表中字段

用DDL语句向分区表中添加分区字段的数据

分区表中的分区字段以目录形式存在


用Put上传数据(数据要和分区字段对应)

青岛分区

济南分区

用load上传数据(需要指定分区字段)

在这种情况下,partition(city='yantai') 是用来指定加载的数据应该存储在 test_fq1 表的 city 分区中,其中 city 是分区字段,'yantai' 是该分区的值。

当你将数据加载到分区表中时,必须指定数据应该存储在哪个分区中,这样 Hive 才知道要将数据存储在哪个目录下。如果不指定分区信息,Hive 会默认将数据存储在表的根目录下,而不是分区目录中。因此,为了确保数据正确地存储在相应的分区中,需要在加载数据时明确指定分区信息。

所以partition(city='yantai') 是必要的,以确保加载的数据被正确地存储在名为 'yantai' 的城市分区中。


 查询数据


方式2

因为分区字段本质是一个目录,所以直接创建一个分区目录put到表中也可以        

按照分区格式创建对应的目录,将对应数据(分区表中其他字段的数据)放在该文件夹下(vim)


将整个文件夹put到分区表中

但是在partiotions表中没有元数据

怎么把元数据加上?

使用修复分区关键字(hive中执行),这个关键字可以查询分区表中的所有分区目录并添加元数据

msck repair TABLE 表名;

可以看到分区字段被添加进来了


例题 将EMP表中部分数据插入Hive,并以deptno为分区字段建立分区表

第一步 准备三个数据源

注意Hive中的数据不需要加单引号,日期用-连接,SQL语句中插入String或data数据需要加引号

第二步 建表

第三步 将数据源导入虚拟机

第四步 上传数据

第五步 查询数据


多级分区表

如果你觉得一个分区不够细化,可以在一级分区后再建立二级分区 三级分区 ...

工作中的分区先后顺序

时间|地区|业务维度

 什么字段适合做分区字段?

维度字段:group by后面的字段 比如emp表中的empno deptno job 


建表

partitioned by(分区字段1 类型,分区字段2 类型...)

用load直接插入分区数据,不再需要alter


动态分区表

创建动态分区表

创建普通临时表存储数据

 将数据上传到普通表中(包括分区字段的数据)

通过Insert into语句将数据从普通表加工到动态分区表

临时表最后一个字段名可以和分区表中的分区字段名不相同,因为临时表只提供了分区字段的数据

字段顺序不同时

分桶表

数据分桶的定义

分桶是相对分区进行更细粒度的划分。 分桶是指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀地分发到各个桶文件中,通过分区将这些表数据划分到多个文件中进行存储。

因为分桶操作需要根据某一列具体数据来进行哈希取模操作,故指定的分桶列必须基于表中的某一列(字段)。因为分桶改变了数据的存储方式,它会把哈希取模相同或者在某一区间的数据行放在同一个桶文件中。

其实桶的概念就是 MapReduce 分区的概念。物理上每个桶就是目录里的一个文件,一个任务作业产生的桶(即:输出文件)数量和设置的 reduce 任务个数相等。


数据分桶的意义
  • 在处理大规模数据集时,在开发和修改查询阶段,可以使用整个数据集的一部分进行抽样测试查询、修改,提高开发效率;
  • 解决单个表文件数据量过大的问题,减少全表扫描;
  • 分桶表数据进行抽样和 JOIN 时可以提高 MapReduce 程序效率(减少JOIN的匹配次数),相同ID的桶才会进行ON条件匹配,JOIN时的两张表必须使用相同的分桶字段,分桶数必须相同

实现分桶的步骤

假设有 hive 表 student_fentong,按照其字段 c_id 属性分为 3 个桶,那么就是对 c_id 属性值的 hash 值对 3 取模,按照取模结果对数据分桶。如取模结果为 0 的数据记录存放到一个文件,取模为 1 的数据存放到一个文件,取模为 2 的数据存放到一个文件。

分桶表功能开启


创建分桶表和普通表

创建分桶表的关键字为:clustered by,来指定表已存在的列名,注意此处指定的列名 c_id 不需要指定其类型,因为是表student_fentong 存在的字段 c_id,已指定其类型为string,因此在分桶时只需指定字段名即可。

指定数字 3 buckets 表示为分 3 个桶,其他关键字与分区表创建含义一致。


加载数据 

因为分桶表加载数据底层走的是 MapReduce 任务,所以之前讲到过的分区表的加载数据方式:hdfs dfs -put file... 和 load data[local] inpath...均不适用于分桶表的数据加载,因此只能通过 insert 的方式来加载数据。

两种写法,overwrite是先删除后插入


查询数据


Hive 分区表与分桶表的异同点

相同点

分区和分桶都是对数据进行更细粒度的处理,便于数据的管理和开发效率的提升。 2. 都有固定且特有的关键字用于指定是否是分区表或分桶表。


不同点

表现形式

分区表:是指按照数据表的某列或某些列分为多个区,形式上可以理解为文件夹,可以是一级文件夹,也可以是多级文件夹,类似于目录。

分桶表:是相对分区进行更细粒度的划分,形式上可以理解为将一个文件的内容按照规则划分成多个文件进行存储,类似于文件。

关键字

分区表:使用关键字 partitioned by 标记,指定的分区字段名为:伪列(非表中定义的字段),同时需要指定伪列的字段类型。

分桶表:使用关键字 clustered by 标记,指定的分桶字段名为:真实字段(表中已定义的字段),但不需要指定分桶字段的类型,因为在表定义时字段已指定类型。 但是需要指定桶的个数。

数量上

分区表:分区个数创建后后续可以依据需求动态增加

分桶表:桶的个数一旦指定,不能再增加

作用上

  • 分区避免全表扫描,根据 where 条件指定分区列来查询指定目录提高查询速度;
  • 分桶保存分桶查询结果的分桶结构(因为数据已经按照分桶字段进行了 hash 散列);
  • 分桶表数据进行抽样和 join 时可以提高 MapReduce 程序效率;

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# weiboHotWord 基于hadoophive的微博热词跟踪系统 # 对应的blog地址为: <br /> <1>首先是利用微博的api得到每天的微博数据</br> <2>编写hadoop项目对微博内容进行分词统计,设置一个阀值,当一个词的出现的数目超过这个阀值时就将其加入到热词列表里,在以后的每天就对其进行统计</br> <3>将处理后的数据写入hive</br> 整片博客分为这几个部分 : 1:微博热词跟踪系统概述 2:需求分析 3:算法模型 4:架构设计 5:程序实现 6:结果可视化 ———————————————— -------- 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值