96SEO 2026-02-19 09:22 0
数据仓库的目的是构…Hive3入门至精通(基础、部署、理论、SQL、函数、运算以及性能优化)1-14章

Warehouse简称数仓、DW,是一个用于存储、分析、报告的数据系统。
数据仓库的目的是构建面向分析的集成化数据环境分析结果为企业提供决策支持Decision
数据仓库本身并不“生产”任何数据其数据来源于不同外部系统同时数据仓库自身也不需要“消费”任何的数据其结果开放给各个外部应用使用这也是为什么叫“数据仓库”而不叫“数据工厂”的原因
中国人寿保险集团公司下辖多条业务线包括人寿险、财险、车险养老险等。
各业务线的业务正常运营需要记录维护包括客户、保单、收付费、核保、理赔等信息。
联机事务处理系统OLTP正好可以满足上述业务需求开展,
其主要任务是执行联机事务处理。
其基本特征是前台接收的用户数据可以立即传送到后台进行处理并在很短的时间内给出处理结果。
关系型数据库RDBMS是OLTP典型应用比如Oracle、MySQL、SQL
随着集团业务的持续运营业务数据将会越来越多。
由此也产生出许多运营相关的困惑
为了能够正确认识这些问题最稳妥办法就是基于业务数据开展数据分析基于分析的结果给决策提供支撑。
也就是所谓的数据驱动决策的制定
OLTP系统的核心是面向业务支持业务支持事务。
所有的业务操作可以分为读、写两种操作一般来说读的压力明显大于写的压力。
如果在OLTP环境直接开展各种分析有以下问题需要考虑
数据分析也是对数据进行读取操作会让读取压力倍增OLTP仅存储数周或数月的数据数据分散在不同系统不同表中字段类型属性不统一
当分析所涉及数据规模较小的时候在业务低峰期时可以在OLTP系统上开展直接分析。
但是为了更好的进行各种规模的数据分析同时也不影响OLTP系统运行此时需要构建一个集成统一的数据分析平台。
该平台的目的很简单面向分析支持分析并且和OLTP系统解耦合。
基于这种需求数据仓库的雏形开始在企业中出现了
如数仓定义所说,数仓是一个用于存储、分析、报告的数据系统目的是构建面向分析的集成化数据环境。
我们把这种面向分析、支持分析的系统称之为OLAP联机分析处理系统数据仓库是OLAP一种。
中国人寿保险公司就可以基于分析决策需求构建数仓平台。
数据仓库目的是构建面向分析的集成化数据环境分析结果为企业提供决策支持Decision
Support。
数据仓库本身并不“生产”任何数据其数据来源于不同外部系统数据仓库自身也不需要“消费”任何的数据其结果开放给各个外部应用使用
数据库中最大的特点是面向应用进行数据的组织各个业务系统可能是相互分离的。
而数据仓库则是面向主题的。
主题是一个抽象的概念是较高层次上企业信息系统中的数据综合、归类并进行分析利用的抽象。
在逻辑意义上它是对应企业中某一宏观分析领域所涉及的分析对象。
操作型处理传统数据对数据的划分并不适用于决策分析。
而基于主题组织的数据则不同它们被划分为各自独立的领域每个领域有各自的逻辑内涵但互不交叉在抽象层次上对数据进行完整、一致和准确的描述。
确定主题之后就需要获取和主题相关的数据。
当下企业中主题相关的数据通常会分布在多个操作型系统中彼此分散、独立、异构。
在数据进入数据仓库之前必然要经过统一与综合对数据进行抽取、清理、转换和汇总这一步是数据仓库建设中最关键、最复杂的一步所要完成的工作有
要统一源数据中所有矛盾之处如字段的同名异义、异名同义、单位不统一、字长不一致等等。
进行数据综合和计算。
数据仓库中的数据综合工作可以在从原有数据库抽取数据时生成但许多是在数据仓库内部生成的即进入数据仓库以后进行综合生成的。
下图说明了保险公司综合数据的简单处理过程其中数据仓库中与“承保”主题有关的数据来自于多个不同的操作型系统。
这些系统内部数据的命名可能不同数据格式也可能不同。
把不同来源的数据存储到数据仓库之前需要去除这些不一致
数据仓库是分析数据的平台而不是创造数据的平台。
我们是通过数仓去分析数据中的规律而不是去创造修改其中的规律。
因此数据进入数据仓库后它便稳定且不会改变。
操作型数据库主要服务于日常的业务操作使得数据库需要不断地对数据实时更新以便迅速获得当前最新数据不至于影响正常的业务运作。
在数据仓库中只要保存过去的业务数据不需要每一笔业务都实时更新数据仓库而是根据商业需要每隔一段时间把一批较新的数据导入数据仓库。
数据仓库的数据反映的是一段相当长的时间内历史数据的内容是不同时点的数据库快照的集合以及基于这些快照进行统计、综合和重组的导出数据。
数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘一旦数据进入数据仓库以后一般情况下被较长时间保留。
数据仓库中一般有大量的查询操作但修改和删除操作很少。
数据仓库包含各种粒度的历史数据数据可能与某个特定日期、星期、月份、季度或者年份有关。
数据仓库的用户不能修改数据但并不是说数据仓库的数据是永远不变的。
分析的结果只能反映过去的情况当业务变化后挖掘出的模式会失去时效性。
因此数据仓库的数据需要随着时间更新以适应决策的需要。
从这个角度讲数据仓库建设是一个项目更是一个过程
数据仓库的数据时限一般要远远长于操作型数据的数据时限。
操作型系统存储的是当前数据而数据仓库中的数据是历史数据。
数据仓库中的数据是按照时间顺序追加的它们都带有时间属性。
Processing主要目标是做数据处理它是针对具体业务在数据库联机的日常操作通常对少数记录进行查询、修改。
用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。
传统的关系型数据库系统RDBMS作为数据管理的主要手段主要用于操作型处理。
Processing主要目标是做数据分析。
一般针对某些主题的历史数据进行复杂的多维分析支持管理决策。
数据仓库是OLAP系统的一个典型示例主要用于数据分析。
数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别。
OLTP系统的典型应用就是RDBMS,也就是我们俗称的数据库当然这里要特别强调此数据库表示的是关系型数据库Nosql数据库并不在讨论范围内。
OLAP系统的典型应用就是DW,也就是我们俗称的数据仓库。
数据仓库不是大型的数据库虽然数据仓库存储数据规模大。
数据仓库的出现并不是要取代数据库。
数据库是面向事务的设计数据仓库是面向主题设计的。
数据库一般存储业务数据数据仓库存储的一般是历史数据。
数据库是为捕获数据而设计数据仓库是为分析数据而设计。
是面向单个部门使用的。
可以认为数据集市是数据仓库的子集也有把数据集市叫做小型数据仓库。
数据集市通常只涉及一个主题领域例如市场营销或销售。
因为它们较小且更具体所以它们通常更易于管理和维护并具有更灵活的结构。
下图中各种操作型系统数据和包括文件在内的等其他数据作为数据源经过ETL(抽取转换加载)填充到数据仓库中数据仓库中有不同主题数据数据集市则根据部门特点面向指定主题比如Purchasing采购、Sales销售、Inventory库存用户可以基于主题数据开展各种应用数据分析、数据报表、数据挖掘。
数据仓库的特点是本身不生产数据也不最终消费数据。
按照数据流入流出数仓的过程进行分层就显得水到渠成。
每个企业根据自己的业务需求可以分成不同的层次。
但是最基础的分层思想理论上分为三个层操作型数据层ODS、数据仓库层(DW)和数据应用层(DA)。
企业在实际运用中可以基于这个基础分层之上添加新的层次来满足不同的业务需求
为了更好的理解数据仓库分层的思想以及每层的功能意义下面结合阿里巴巴提供出的数仓分层架构图进行分析。
阿里数仓是非常经典的3层架构从下往上依次是ODS、DW、DA。
通过元数据管理和数据质量监控来把控整个数仓中数据的流转过程、血缘依赖关系和生命周期。
操作型数据层也称之为源数据层、数据引入层、数据暂存层、临时缓存层。
此层存放未经过处理的原始数据至数据仓库系统结构上与源系统保持一致是数据仓库的数据准备区。
主要完成基础数据引入到数仓的职责和数据源系统进行解耦合同时记录基础数据的历史变化。
数据仓库层由ODS层数据加工而成。
主要完成数据加工与整合建立一致性的维度构建可复用的面向分析和统计的明细事实表以及汇总公共粒度的指标。
内部具体划分如下
公共维度层DIM基于维度建模理念思想建立整个企业一致性维度。
公共汇总粒度事实层DWS、DWB以分析的主题对象作为建模驱动基于上层的应用和产品的指标需求构建公共粒度的汇总指标事实表以宽表化手段物理化模型明细粒度事实层DWD:
数据应用层面向最终用户面向业务定制提供给产品和数据分析使用的数据。
包括前端报表、分析图表、KPI、仪表盘、OLAP专题、数据挖掘等分析。
每一个数据分层都有它的作用域在使用表的时候能更方便地定位和理解。
简单来说我们最终给业务呈现的是一个能直接使用业务表但是它的来源有很多如果有一张来源表出问题了我们希望能够快速准确地定位到问题并清楚它的危害范围。
将一个复杂的任务分解成多个步骤来完成每一层只处理单一的步骤比较简单和容易理解。
而且便于维护数据的准确性当数据出现问题之后可以不用修复所有的数据只需要从有问题的步骤开始修复。
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL抽取Extra,
但是在实际操作中将数据加载到仓库却产生了两种不同做法ETL和ELT。
首先从数据源池中提取数据这些数据源通常是事务性数据库。
数据保存在临时暂存数据库中ODS。
然后执行转换操作将数据结构化并转换为适合目标数据仓库系统的形式。
然后将结构化数据加载到仓库中以备分析。
使用ELT数据在从源数据池中提取后立即加载。
没有专门的临时数据库ODS这意味着数据会立即加载到单一的集中存储库中。
数据在数据仓库系统中进行转换以便与商业智能工具BI工具一起使用。
大数据时代的数仓这个特点很明显。
Hive是一款建立在Hadoop之上的开源数据仓库系统可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表基于表提供了一种类似SQL的查询模型称为Hive查询语言HQL用于访问和分析存储在Hadoop文件中的大型数据集。
Hive核心是将HQL转换为MapReduce程序然后将程序提交到Hadoop群集执行。
Hive由Facebook实现并开源。
人员学习成本太高需要掌握java语言MapReduce实现复杂查询逻辑开发难度太大
操作接口采用类SQL语法提供快速开发的能力简单、容易上手避免直接写MapReduce减少开发人员的学习成本支持自定义函数功能扩展很方便背靠Hadoop擅长存储分析海量数据集
Hive作为一款大数据时代的数据仓库软件当然也具备上述两种能力。
只不过Hive并不是自己实现了上述两种能力而是借助Hadoop。
Hive利用Hadoop的HDFS存储数据利用Hadoop的MapReduce查询分析数据。
这样突然发现Hive没啥用不过是套壳Hadoop罢了。
其实不然Hive的最大的魅力在于用户专注于编写HQLHive帮您转换成为MapReduce程序完成对数据的分析。
CLI、JDBC/ODBC、WebGUI。
其中CLI(command
interface)为shell命令行Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互类似于JDBC或ODBC协议。
WebGUI是通过浏览器访问Hive
中的元数据包括表的名字表的列和分区及其属性表的属性是否为外部表等表的数据所在目录等
查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
生成的查询计划存储在
Hive本身并不直接处理数据文件。
而是通过执行引擎处理。
当下Hive支持MapReduce、Tez、Spark3种执行引擎
数据模型用来描述数据、组织数据和对数据进行操作是对现实世界数据特征的描述。
、Hive的数据模型类似于RDBMS库表结构此外还有自己特有模型。
Hive中的数据可以在粒度级别上分为三类
Hive作为一个数据仓库在结构上积极向传统数据库看齐也分数据库Schema每个数据库下面有各自的表组成。
默认数据库default。
Hive的数据都是存储在HDFS上的默认有一个根目录在hive-site.xml中由参数hive.metastore.warehouse.dir指定。
默认值为/user/hive/warehouse。
因此如果没有设置特定路径那么Hive中的数据库在HDFS上的存储路径为/user/hive/warehouse/databasename.db
Hive表与关系数据库中的表相同。
Hive中的表所对应的数据通常是存储在HDFS中而表相关的元数据是存储在RDBMS中。
Hive中的表的数据在HDFS上的存储路径为/user/hive/warehouse/databasename.db/tablename
Partition分区是hive的一种优化手段表。
分区是指根据分区列例如“日期day”的值将表划分为不同分区。
这样可以更快地对指定分区数据进行查询。
分区在存储层面上的表现是:table表目录下以子文件夹形式存在。
一个文件夹表示一个分区。
子文件命名标准分区列分区值Hive还支持分区下继续创建分区所谓的多重分区。
关于分区表的使用和详细介绍后面模块会单独展开。
Bucket分桶表是hive的一种优化手段表。
分桶是指根据表中字段例如“编号ID”的值,经过hash计算规则将数据文件划分成指定的若干个小文件。
分桶规则hashfunc(字段)
桶个数余数相同的分到同一个文件。
分桶的好处是可以优化join查询和方便抽样查询。
Bucket分桶表在HDFS中表现为同一个表目录下数据根据hash散列之后变成多个文件。
Hive虽然具有RDBMS数据库的外表包括数据模型、SQL语法都十分相似但hive应用场景和MySQL却完全不同。
Hive只适合用来做海量数据的离线分析。
Hive的定位是数据仓库面向分析的OLAP系统。
Hive不是大型数据库也无法取代MySQL承担业务数据处理。
元数据Metadata又称中介数据、中继数据为描述数据的数据data
data主要是描述数据属性property的信息用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
Metadata即Hive的元数据。
包含用Hive创建的database、table、表的位置、类型、属性字段顺序类型等元信息。
元数据存储在关系型数据库中。
如hive内置的Derby、或者第三方如MySQL等。
Metastore即元数据服务。
Metastore服务的作用是管理metadata元数据对外暴露服务地址让各种客户端通过连接metastore服务由metastore再去连接MySQL数据库来存取元数据。
有了metastore服务就可以有多个客户端同时连接而且这些客户端不需要知道MySQL数据库的用户名和密码只需要连接metastore
metastore服务配置有3种模式内嵌模式、本地模式、远程模式。
Metadata是存储在内置的derby中还是第三方RDBMS,比如MySQL。
Metastore是metastore默认部署模式。
内嵌模式模式下元数据存储在内置的Derby数据库并且Derby数据库和metastore服务都嵌入在主HiveServer进程中当启动HiveServer进程时Derby和metastore都会启动。
不需要额外起Metastore服务。
但是一次只能支持一个活动用户仅仅适用于调试和测试体验不适用于生产环境。
Metastore下Metastore服务与主HiveServer进程在同一进程中运行但是存储元数据的数据库在单独的进程中运行并且可以在单独的主机上。
metastore服务将通过JDBC与metastore数据库进行通信。
本地模式采用外部数据库来存储元数据推荐使用MySQL。
hive根据hive.metastore.uris参数值来判断如果为空则为本地模式。
本地模式缺点是每启动一次hive服务都内置启动了一个metastore。
Metastore下Metastore服务在其自己的单独JVM上运行而不在HiveServer的JVM中运行。
如果其他进程希望与Metastore服务器通信则可以使用Thrift
API进行通信。
远程模式下需要配置hive.metastore.uris
参数来指定metastore服务运行的机器ip和端口并且需要单独手动启动metastore服务。
元数据也采用外部数据库来存储元数据推荐使用MySQL。
在生产环境中建议用远程模式来配置Hive
Metastore。
在这种情况下其他依赖hive的软件都可以通过Metastore访问hive。
由于还可以完全屏蔽数据库层因此这也带来了更好的可管理性/安全性。
Hive是一款基于Hadoop的数据仓库软件通常部署运行在Linux系统之上。
因此不管使用何种方式配置Hive
Metastore必须要先保证服务器的基础环境正常Hadoop集群健康可用。
服务器基础环境
集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装Hadoop集群健康可用
启动Hive之前必须先启动Hadoop集群。
特别要注意需等待HDFS安全模式关闭之后再启动运行Hive。
Hive不是分布式安装运行的软件其分布式的特性主要借由Hadoop完成。
包括分布式存储、分布式计算。
如果还没有hadoop集群可以参考另一篇hadoop文章进行准备
https://blog.csdn.net/wt334502157/article/details/114916871
https://blog.csdn.net/wt334502157/article/details/115419462
由于篇幅原因hive3.1.2的详细安装部署步骤可以参考hive安装部署文章
链接https://pan.baidu.com/s/1kPr0uTEXqslxZ3v_r-uLQQ
上传安装包MySQL安装MySQL配置hive安装配置Metastore到MySql修改hadoop环境变量解决jar包冲突启动hive启动前处理guava的jar包冲突
第一代客户端deprecated不推荐使用$HIVE_HOME/bin/hive,
shellUtil。
主要功能一是可用于以交互或批处理模式运行Hive查询二是用于Hive相关服务的启动比如metastore服务。
第二代客户端recommended
推荐使用$HIVE_HOME/bin/beeline是一个JDBC客户端是官方强烈推荐使用的Hive命令行工具和第一代客户端相比性能加强安全性提高。
HiveServer2服务上这也是官方推荐在生产环境中使用的模式
bin/hive。
该客户端可以访问hive的metastore服务从而达到操作hive的目的。
需要启动运行metastore服务。
可以直接在启动Hive
metastore服务的机器上使用bin/hive客户端操作此时不需要进行任何配置。
hive经过发展推出了第二代客户端beeline但是beeline客户端不是直接访问metastore服务的而是需要单独启动hiveserver2服务在hive安装的服务器上首先启动metastore服务然后启动hiveserver2服务Beeline是JDBC的客户端通过JDBC协议和Hiveserver2服务进行通信协议的地址是jdbc:hive2://ip:port
12345678910111213141516171819202122232425HiveServer和HiveServer2服务
HiveServer、HiveServer2都是Hive自带的两种服务允许客户端在不启动CLI命令行的情况下对Hive中的数据进行操作且两个都允许远程客户端使用多种编程语言如javapython等向hive提交请求取回结果。
HiveServer不能处理多于一个客户端的并发请求。
因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2进而解决了该问题。
HiveServer已经被废弃。
HiveServer2支持多客户端的并发和身份认证旨在为开放API客户端如JDBC、ODBC提供更好的支持。
HiveServer2通过Metastore服务读写元数据。
所以在远程模式下启动HiveServer2之前必须先首先启动metastore服务远程模式下Beeline客户端只能通过HiveServer2服务访问Hive。
而bin/hive是通过Metastore服务访问
按照MySQL的思维在hive中创建、切换数据库创建表并执行插入数据操作最后查询是否插入成功
command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e):
command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e);
command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e):
command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e);
command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea):
Schema(fieldSchemas:[FieldSchema(name:database_name,
command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea);
command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea):
command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea);
12345678910111213141516171819进入数据库
command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb):
command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb);
command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb):
command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb);
command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78):
command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78);
command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78):
command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78);
command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b):
Schema(fieldSchemas:[FieldSchema(name:_col0,
command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b);
command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b):
wangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b
hive.exec.reducers.bytes.per.reducernumber
http://ops02:8088/proxy/application_1615531413182_10785/
http://ops02:8088/proxy/application_1615531413182_10785/
/opt/module/hadoop-3.1.3/bin/mapred
hdfs://ops01:8020/user/hive/warehouse/hv_2022_10_13.db/t_student/.hive-staging_hive_2022-10-13_16-07-08_795_1543917524199913194-6/-ext-10000
hdfs://ops01:8020/user/hive/warehouse/hv_2022_10_13.db/t_student/.hive-staging_hive_2022-10-13_16-07-08_795_1543917524199913194-6/-ext-10002
hdfs://ops01:8020/user/hive/warehouse/hv_2022_10_13.db/t_student/.hive-staging_hive_2022-10-13_16-07-08_795_1543917524199913194-6/-ext-10000
command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b);
最终插入一条数据历史37.266秒的时间。
查询表数据显示数据插入成功
command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994):
Schema(fieldSchemas:[FieldSchema(name:t_student.id,
FieldSchema(name:t_student.name,type:varchar(255),
command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994);
command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994):
command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994);
--------------------------------
--------------------------------
--------------------------------
HDFS浏览文件系统根据Hive的数据模型表的数据最终是存储在HDFS和表对应的文件夹下的
SQL语法和标准SQL很类似Hive底层是通过MapReduce执行的数据插入动作,所以速度慢。
如果大数据集这么一条一条插入的话是非常不现实的时间成本极高。
Hive应该具有自己特有的数据插入表方式结构化文件映射成为表。
在HDFS根目录下创建一个结构化数据文件user.txt里面内容如下
wangtingops01:/home/wangting/20221013
6,tony,26,beijingwangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
在hive中创建一张表t_user。
注意字段的类型顺序要和文件中字段保持一致。
command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d):
command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d);
command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d):
command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d);
command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15):
Schema(fieldSchemas:[FieldSchema(name:t_user.id,
type:varchar(255),comment:null),
command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15);
command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15):
command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15);
-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
执行数据查询操作发现表中并没有数据说明创建的t_user表和user.txt并没有形成映射关系
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/t_user
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/t_user
/user/hive/warehouse/hv_2022_10_13.db/t_user/user.txt
command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18):
Schema(fieldSchemas:[FieldSchema(name:t_user.id,
type:varchar(255),comment:null),
command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18);
command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18):
command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18);
-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
seconds)再次执行查询操作值都是null说明感知到文件但是并没有把内容一一对应起来
command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c):
command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c);
command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c):
command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c);
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/t_user_1/
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/t_user_1/user.txt
6,tony,26,beijing查询新表t_user_1内容
command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6):
Schema(fieldSchemas:[FieldSchema(name:t_user_1.id,
FieldSchema(name:t_user_1.name,
FieldSchema(name:t_user_1.city,
command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6);
command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6):
command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6);
-------------------------------------------------------------
-------------------------------------------------------------
-------------------------------------------------------------
此时再创建一张表t_user_2保存分隔符语法但是故意使得字段类型和文件中不一致,测试一下字段约束类型不符会如何
command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad):
command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad);
command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad):
command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad);
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/t_user_2/查询新表t_user_2内容
command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f):
Schema(fieldSchemas:[FieldSchema(name:t_user_2.id,
FieldSchema(name:t_user_2.name,
FieldSchema(name:t_user_2.city,
command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f);
command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f):
command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f);
-------------------------------------------------------------
-------------------------------------------------------------
-------------------------------------------------------------
seconds)此时发现有的列name显示null有的列显示正常
name字段本身是字符串但是建表的时候指定int类型转换不成功age是数值类型建表指定字符串类型可以转换成功。
说明hive中具有自带的类型转换功能但是不一定保证转换成功
要想在hive中创建表跟结构化文件映射成功需要注意以下几个方面问题
创建表时字段顺序、字段类型要和文件中保持一致。
如果类型不一致hive会尝试转换但是不保证转换成功。
不成功显示null。
command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e):
Schema(fieldSchemas:[FieldSchema(name:_c0,
command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e);
command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e):
wangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e
hive.exec.reducers.bytes.per.reducernumber
http://ops02:8088/proxy/application_1615531413182_10786/
http://ops02:8088/proxy/application_1615531413182_10786/
/opt/module/hadoop-3.1.3/bin/mapred
command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e);
seconds)从控制台输出可以发现又是通过MapReduce程序执行的数据查询功能
Hive底层的确是通过MapReduce执行引擎来处理数据的执行完一个MapReduce程序需要的时间较长如果是小数据集使用hive进行分析将得不偿失延迟很高如果是大数据集使用hive进行分析底层MapReduce分布式计算
准备工作可以根据情况选择是否准备大部分语句可以通过命令行客户端去执行推荐使用开发环境去熟悉。
IDEA是JetBrains公司的产品是java编程语言开发的集成环境。
在业界被公认为最好的java开发工具尤其在智能代码助手、代码自动提示、重构、代码分析、
还有丰富的插件其中就内置集成了Database插件支持操作各种主流的数据库、数据仓库
链接https://pan.baidu.com/s/14Pl4KnqjGj0nf05d7JSrxw?pwdkfud
DDL)是SQL语言集中对数据库内部的对象结构进行创建删除修改等的操作语言这些数据库对象包括databaseschema、table、view、index等。
DDL核心语法由CREATE、ALTER与DROP三个所组成。
DDL并不涉及表内部数据的操作。
在某些上下文中该术语也称为数据描述语言因为它描述了数据库表中的字段和记录。
SQLHQL与标准SQL的语法大同小异基本相通注意差异即可基于Hive的设计、使用特点HQL中create语法尤其create
建表是否成功直接影响数据文件是否映射成功进而影响后续是否可以基于SQL分析数据。
(property_nameproperty_value,...)]
SQL中数据类型英文字母大小写不敏感除SQL数据类型外还支持Java数据类型比如字符串string复杂数据类型的使用通常需要和分隔符指定语法配合使用如果定义的数据类型和文件不一致Hive会尝试隐式转换但是不保证成功。
与标准SQL类似HQL支持隐式和显式类型转换。
原生类型从窄类型到宽类型的转换称为隐式转换反之则不允许
SerDe是Serializer、Deserializer的简称目的是用于序列化和反序列化。
序列化是对象转化为字节码的过程而反序列化是字节码转换为对象的过程。
Hive使用SerDe包括FileFormat读取和写入表行对象。
需要注意的是“key”部分在读取时会被忽略而在写入时key始终是常数。
基本上行对象存储在“value”中。
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
org.apache.hadoop.mapred.TextInputFormat
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Hive读取文件机制首先调用InputFormat默认TextInputFormat返回一条一条kv键值对记录默认是一行对应一条键值对。
然后调用SerDe默认LazySimpleSerDe的Deserializer将一条记录中的value根据分隔符切分为各个字段。
Hive写文件机制将Row写入文件时首先调用SerDe默认LazySimpleSerDe的Serializer将对象转换成字节序列然后调用OutputFormat将数据写入HDFS文件中
FORMAT这一行所代表的是跟读写文件、序列化SerDe相关的语法功能有二
FORMAT是语法关键字DELIMITED和SERDE二选其一。
如果使用delimited表示使用默认的LazySimpleSerDe类来处理数据。
serde_name指定其他的Serde类来处理数据,甚至支持用户自定义SerDe类。
LazySimpleSerDe是Hive默认的序列化类包含4种子语法分别用于指定字段之间、集合元素之间、map映射
默认的分割符是’\001’是一种特殊的字符使用的是ASCII编码的值键盘是打不出来的
在vim编辑器中连续按下Ctrlv/Ctrla即可输入’\001’
wangtingops01:/home/wangting/20221013
/water_bill/output_ept_10W_export_0817/part-m-00000
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
SEQ1org.apache.hadoop.hbase.io.ImmutableBytesWritable%org.apache.hadoop.hbase.client.Result8u
wangtingops01:/home/wangting/20221013
SEQ^F1org.apache.hadoop.hbase.io.ImmutableBytesWritable%org.apache.hadoop.hbase.client.Result^^^^^^8u^V8d^BÕݬ9a
^S81ðN^^^Aû^^^^K^^^^G0000132î^C
ÿ8d80949f.(^D21山西ç9c81å¿»å·9eå¸82å818få85³å8e¿æ96°å85³é95877å8d95å8583124室
^G0000132^R^BC1^Z^LNUM_PREVIOUS
Hive表默认存储路径是由${HIVE_HOME}/conf/hive-site.xml配置文件的hive.metastore.warehouse.dir属性指定默认值是/user/hive/warehouse
在Hive建表的时候可以通过location语法来更改数据在HDFS上的存储路径使得建表加载数据更加灵活方便
对于已经生成好的数据文件使用location指定路径将会很方便
https://osswangting.oss-cn-shanghai.aliyuncs.com/hive/honor_of_kings.zip
文件archer.txt中记录了手游《王者荣耀》射手的相关信息包括生命、物防、物攻等属性信息其中字段之间分隔符为制表符\t,要求在Hive中建表映射成功该文件
assassin字段含义id、name英雄名称、hp_max最大生命、mp_max最大法力、attack_max最高物攻、defense_max最大物防、attack_range攻击范围、role_main主要定位、role_assist次要定位。
字段都是基本类型字段的顺序需要注意。
字段之间的分隔符是制表符需要使用row
\t;建表成功之后在Hive的默认存储路径下就生成了表对应的文件夹
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/t_archer查数验证
文件hot_hero_skin_price.txt中记录了手游《王者荣耀》热门英雄的相关皮肤价格信息,要求在Hive中建表映射成功该文件
1,孙悟空,53,西部大镖客:288-大圣娶亲:888-全息碎片:0-至尊宝:888-地狱火:1688
2,鲁班七号,54,木偶奇遇记:288-福禄兄弟:288-黑桃队长:60-电玩小子:2288-星空梦想:0
3,后裔,53,精灵王:288-阿尔法小队:588-辉光之辰:888-黄金射手座:1688-如梦令:1314
5,韩信,52,飞衡:1788-逐梦之影:888-白龙吟:1188-教廷特使:0-街头霸王:888
字段id、name英雄名称、win_rate胜率、skin_price皮肤及价格前3个字段原生数据类型、最后一个字段复杂类型map。
需要指定字段之间分隔符、集合元素之间分隔符、map
--集合元素kv之间分隔符;建表成功之后在Hive的默认存储路径下就生成了表对应的文件夹
把hot_hero_skin_price.txt文件上传到对应的表文件夹下
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/t_hot_hero_skin_price查数验证
文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息字段之间使用的是\001作为分隔符,要求在Hive中建表映射成功该文件
有不可见字符自行下载https://osswangting.oss-cn-shanghai.aliyuncs.com/hive/honor_of_kings.zip
字段id、team_name战队名称、ace_player_name王牌选手名字数据都是原生数据类型且字段之间分隔符是\001因此在建表的时候可以省去row
);建表成功后把team_ace_player.txt文件上传到对应的表文件夹下
wangtingops01:/home/wangting/20221013
文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息字段之间使用的是\001作为分隔符。
要求把文件上传到HDFS任意路径下不能移动复制并在Hive中建表映射成功该文件
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
table。
默认情况下创建的表就是内部表Hive拥有该表的结构和文件。
换句话说Hive完全管理表元数据和数据的生命周期类似于RDBMS中的表。
当删除内部表时会删除数据以及表的元数据
tablename,来获取表的元数据描述信息从中可以看出表的类型
table中的数据不是Hive拥有或管理的只管理表元数据的生命周期。
要创建一个外部表需要使用EXTERNAL语法关键字。
删除外部表只会删除元数据而不会删除实际数据。
在Hive外部仍然可以访问实际数据。
实际场景中外部表搭配location语法指定数据的路径可以让数据更安全
tablename,来获取表的元数据描述信息从中可以看出表的类型
Metastore中管理表定义、字段类型等元数据信息。
删除内部表时除了会从Metastore中删除表元数据还会从HDFS中删除其所有数据文件。
删除外部表时只会从Metastore中删除表的元数据并保持HDFS位置中的实际数据不变。
当需要通过Hive完全管理控制表的整个生命周期时请使用内部表。
当数据来之不易防止误删请使用外部表因为即使删除表文件也会被保留。
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
/20221014/out/t_user_out查询数据验证结果
-----------------------------------------------------------------
-----------------------------------------------------------------
-----------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
/20221014/out/t_user_out将内外表删除drop
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
/20221014/out/t_user_out内部表drop删除后hdfs上的/20221014/in/t_user_in文件已经同步被删除
外部表drop删除后hdfs上的/20221014/out/t_user_out文件依旧还在hdfs上
当Hive表对应的数据量大、文件个数多时为了避免查询时全表扫描数据Hive支持根据指定的字段对表进行分区分区的字段可以是日期、地域、种类等具有标识意义的字段。
例如把一整年的数据根据月份划分12个月12个分区后续就可以查询指定月份分区的数据尽可能避免了全表扫描查询
分区字段不能是表中已经存在的字段因为分区字段最终也会以虚拟字段的形式显示在表结构上
针对《王者荣耀》英雄数据创建一张分区表t_all_hero_part以role角色作为分区字段
------------------------------------------------
------------------------------------------------
------------------------------------------------
wangtingops01:/home/wangting/20221013/hero
wangtingops01:/home/wangting/20221013/hero
/home/wangting/20221013/hero/archer.txt
/home/wangting/20221013/hero/assassin.txt
/home/wangting/20221013/hero/mage.txt
/home/wangting/20221013/hero/support.txt
/home/wangting/20221013/hero/tank.txt
/home/wangting/20221013/hero/warrior.txt
外表上看起来分区表好像没多大变化只不过多了一个分区字段。
实际上分区表在底层管理数据的方式发生了改变。
这里直接去HDFS查看区别
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolecike
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolefashi
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolefuzhu
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolesheshou
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/roletanke
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolezhanshi
12345678分区的概念提供了一种将Hive表数据分离为多个文件/目录的方法。
不同分区对应着不同的文件夹同一分区的数据存储在同一个文件夹下。
查询过滤的时候只需要根据分区值找到对应的文件夹扫描本文件夹下本分区下的文件即可避免全表数据扫描。
这种指定分区查询的方式叫做分区裁剪。
建表时根据业务场景设置合适的分区字段。
比如日期、地域、类别等查询的时候尽量先使用where进行分区过滤查询指定分区的数据避免全表扫描。
比如查询英雄主要定位是射手并且最大生命大于6000的个数。
使用分区表查询和使用非分区表进行查询
通过建表语句中关于分区的相关语法可以发现Hive支持多个分区字段
多重分区下分区之间是一种递进关系可以理解为在前一个分区的基础上继续分区从HDFS的角度来看就是文件夹下继续划分子文件夹。
比如把全国人口数据首先根据省进行分区然后根据市进行划分如果你需要甚至可以继续根据区县再划分此时就是3分区表
t_user_province_citypartition(provincezhejiang,cityhangzhou);
t_user_province_citypartition(provincezhejiang,cityningbo);
t_user_province_citypartition(provinceshanghai,citypudong);--双分区表的使用
所谓动态分区指的是分区的字段值是基于查询结果参数位置自动推断出来的。
核心语法就是insertselect启用hive动态分区需要在hive会话中设置两个参数
hive.exec.dynamic.partitiontrue;
hive.exec.dynamic.partition.modenonstrict;
指定动态分区模式分为nonstick非严格模式和strict严格模式。
strict严格模式要求至少有一个分区为静态分区。
创建一张新的分区表执行动态分区插入。
动态分区插入时分区值是根据查询返回字段位置自动推断的
wangtingops01:/home/wangting/20221013/hero
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero
hive.exec.dynamic.partitiontrue;
hive.exec.dynamic.partition.modenonstrict;
分区表不是建表的必要语法规则是一种优化手段表可选分区字段不能是表中已有的字段不能重复分区字段是虚拟字段其数据并不存储在底层的文件中分区字段值的确定来自于用户价值数据手动指定静态分区或者根据查询结果位置自动推断动态分区Hive支持多重分区也就是说在分区的基础上继续分区划分更加细粒度
分桶表也叫做桶表叫法源自建表语法中bucket单词是一种用于优化查询而设计的表类型。
分桶表对应的数据文件在底层会被分解为若干个部分通俗来说就是被拆分成若干个独立的小文件。
在分桶时要指定根据哪个字段将数据分为几桶几个部分。
hash_function(bucketing_column)
12hash_function取决于分桶字段bucketing_column的类型
int;如果是其他比如bigint,string或者复杂数据类型hash_function比较棘手将是从该类型派生的某个数字比如hashcode值。
BUCKETS表示分为几桶也就是几个部分需要注意的是分桶的字段必须是表中已经存在的字段
链接https://pan.baidu.com/s/1cWq6wd0pfqaCRuBijt1WKg?pwdcc6v
wangtingops01:/home/wangting/20221013/usa
wangtingops01:/home/wangting/20221013/usa
COVID-19-Cases-USA-By-County.csv
COVID-19-Cases-USA-By-State.csv
COVID-19-Deaths-USA-By-County.csv
COVID-19-Deaths-USA-By-State.csv
现有美国2021-1-28号各个县county的新冠疫情累计案例信息包括确诊病例和死亡病例数据格式如下所示
字段含义count_date统计日期,county县,state州,fips县编码code,cases累计确诊病例,deaths累计死亡病例
2021-01-28,Autauga,Alabama,01001,5554,69
2021-01-28,Baldwin,Alabama,01003,17779,225
2021-01-28,Barbour,Alabama,01005,1920,40
2021-01-28,Bibb,Alabama,01007,2271,51
2021-01-28,Blount,Alabama,01009,5612,98
2021-01-28,Bullock,Alabama,01011,1079,29
2021-01-28,Butler,Alabama,01013,1788,60
2021-01-28,Calhoun,Alabama,01015,11833,231
2021-01-28,Chambers,Alabama,01017,3159,76
2021-01-28,Cherokee,Alabama,01019,1682,35根据state州把数据分为5桶建表语句如下
t_usa_covid19_bucket(count_date
t_usa_covid19_bucket_sort(count_date
123456789把源数据加载到普通hive表中创建普通表t_usa_covid19
12345678将映射文件上传hdfs对应普通表t_usa_covid19
将源数据上传到HDFSt_usa_covid19表对应的路径下
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19
------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
seconds)使用insertselect语法将数据加载到分桶表t_usa_covid19_bucket中:
12到HDFS上查看t_usa_covid19_bucket底层数据结构可以发现数据被分为了5个部分。
并且从结果可以发现分桶字段一样的数据就一定被分到同一个桶中。
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19/us-covid19-counties.dat
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000000_0
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000001_0
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000002_0
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000003_0
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000004_0
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000000_0
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000001_0
根据join的字段对表进行分桶操作比如下图中id是join的字段
当数据量特别大时对全体数据进行处理存在困难时抽样就显得尤其重要了。
抽样可以从被抽取的数据中估计和推断出整体的特性是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法
Hive本身从设计之初时就是不支持事务的因为Hive的核心目标是将已经存在的结构化数据文件映射成为表然后提供基于表的SQL分析处理是一款面向分析的工具。
且映射的数据通常存储于HDFS上而HDFS是不支持随机修改文件数据的。
这个定位就意味着在早期的Hive的SQL语法中是没有updatedelete操作的也就没有所谓的事务支持了因为都是select查询分析操作从Hive0.14版本开始具有ACID语义的事务已添加到Hive中以解决以下场景下遇到的问题
Kafka之类的工具将数据流式传输到Hadoop集群中。
虽然这些工具可以每秒数百行或更多行的速度写入数据但是Hive只能每隔15分钟到一个小时添加一次分区。
如果每分甚至每秒频繁添加分区会很快导致表中大量的分区,并将许多小文件留在目录中这将给NameNode带来压力。
因此通常使用这些工具将数据流式传输到已有分区中但这有可能会造成脏读数据传输一半失败回滚了。
需要通过事务功能允许用户获得一致的数据视图并避免过多的小文件产生
星型模式数据仓库中维度表随时间缓慢变化。
例如零售商将开设新商店需要将其添加到商店表中或者现有商店可能会更改其平方英尺或某些其他跟踪的特征。
这些更改导致需要插入单个记录或更新单条记录取决于所选策略
虽然Hive支持了具有ACID语义的事务但是在使用起来并没有像在MySQL中使用那样方便有很多局限性。
原因很简单毕竟Hive的设计目标不是为了支持事务操作而是支持分析操作且最终基于HDFS的底层存储机制使得文件的增加删除修改操作需要动一些小心思。
尚不支持BEGINCOMMIT和ROLLBACK。
所有语言操作都是自动提交的。
仅支持ORC文件格式STORED
ORC。
默认情况下事务配置为关闭。
需要配置参数开启使用。
表必须是分桶表Bucketed才可以使用事务功能。
表参数transactional必须为true外部表不能成为ACID表不允许从非ACID会话读取/写入ACID表。
如果不做任何配置修改直接针对Hive中已有的表进行Update、Delete、Insert操作可以发现只有insert语句可以执行Update和Delete操作会报错。
Insert插入操作能够成功的原因在于底层是直接把数据写在一个新的文件中的
12345678910111213141516171819202122
wangtingops01:/home/wangting/20221013
/user/hive/warehouse/hv_2022_10_13.db/student执行数据修改操作
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
(state42000,code10294)注意此时出现了报错
hive.exec.dynamic.partition.mode
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
--在此metastore实例上运行多少个压缩程序工作线程。
0:
hive.exec.dynamic.partition.mode
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
TBLPROPERTIES(transactionaltrue);
事务表创建几个要素开启参数、分桶表、存储格式orc、表属性针对事务表进行增删改查操作验证
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
Hive中的视图view是一种虚拟表只保存定义不实际存储数据。
通常从真实的物理表查询中创建生成视图也可以从已经存在的视图上创建新视图。
创建视图时将冻结视图的架构如果删除或更改基础表则视图将失败。
视图是用来简化操作的不缓冲记录也没有提高查询性能。
------------------------------------------
------------------------------------------
------------------------------------------
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------
v_usa_covid19_from_view.count_date
---------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------
(state42000,code10090)--4、查看视图定义
----------------------------------------------------
----------------------------------------------------
t_usa_covid19.county,t_usa_covid19.state,t_usa_covid19.deaths
----------------------------------------------------
----------------------------------------------
----------------------------------------------
----------------------------------------------
将真实表中特定的列数据提供给用户保护数据隐式降低查询的复杂度优化查询语句
View是一个包括查询结果的数据库对像可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果。
在执行查询时就可以避免进行这些耗时的操作而从快速的得到结果使用物化视图的目的就是通过预计算提高查询性能当然需要占用一定的存储空间Hive3.0开始尝试引入物化视图并提供对于物化视图的查询自动重写机制基于Apache
Calcite实现Hive的物化视图还提供了物化视图存储选择机制可以本地存储在Hive也可以通过用户自定义storage
handlers存储在其他系统如DruidHive引入物化视图的目的就是为了优化数据查询访问的效率,相当于从数据预处理的角度优化数据访问Hive从3.0丢弃了index索引的语法支持推荐使用物化视图和列式存储文件格式来加快查询的速度
视图是虚拟的逻辑存在的只有定义没有存储数据物化视图是真实的物理存在的里面存储着预计算的数据视图的目的是简化降低查询的复杂度而物化视图的目的是提高查询性能
物化视图能够缓存数据在创建物化视图的时候就把数据缓存起来了Hive把物化视图当成一张“表”将数据缓存。
而视图只是创建一个虚表只有表结构没有数据实际查询的时候再去改写SQL去访问实际的数据表
[db_name.]materialized_view_name[DISABLE
materialized_view_comment][PARTITIONED
...;物化视图创建后select查询执行数据自动落地“自动”也即在query的执行期间任何用户对该物化视图是不可见的,执行完毕之后物化视图可用
默认情况下创建好的物化视图可被用于查询优化器optimizer查询重写在物化视图创建期间可以通过DISABLE
format为hive.materializedview.serde、
hive.materializedview.fileformat
org.apache.hadoop.hive.druid.DruidStorageHandler
[db_name.]materialized_view_name;
[db_name.]materialized_view_name;
当数据源变更新数据插入inserted、数据修改modified物化视图也需要更新以保持数据一致性目前需要用户主动触发rebuild重构sql
[db_name.]materialized_view_name
物化视图创建后即可用于相关查询的加速即用户提交查询query若该query经过重写后可以命中已经存在的物化视图则直接通过物化视图查询数据返回结果以实现查询加速
hive.materializedview.rewritingtrue;
[db_name.]materialized_view_name
用户提交查询query若该query经过重写后可以命中已经存在的物化视图则直接通过物化视图查询数据返回结果以实现查询加速
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
hive.exec.dynamic.partition.mode
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
TBLPROPERTIES(transactionaltrue);
----------------------------------------------------------------
----------------------------------------------------------------
----------------------------------------------------------------
由于会命中物化视图重写query查询物化视图查询速度会加快没有启动MR只是普通的table
通过explain来查询SELECT执行情况可以看到查询走了alias:
hv_2022_10_13.student_trans_agg
----------------------------------------------------
----------------------------------------------------
hv_2022_10_13.student_trans_agg
----------------------------------------------------
在Hive中DATABASE的概念和RDBMS中类似我们称之为数据库DATABASE和SCHEMA是可互换的都可以使用默认的数据库叫做default存储数据位置位于/user/hive/warehouse下用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下
COMMENT数据库的注释说明语句LOCATION指定数据库在HDFS存储位置默认/user/hive/warehouse/dbname.dbWITH
1234如果需要使用location指定路径的时候最好指向的是一个新创建的空文件夹
显示Hive中数据库的名称注释如果已设置及其在文件系统上的位置等信息EXTENDED关键字用于显示更多信息。
可以将关键字describe简写成desc使用
默认行为是RESTRICT这意味着仅在数据库为空时才删除它要删除带有表的数据库不为空的数据库我们可以使用CASCADE
Hive中针对表的DDL操作可以说是DDL中的核心操作包括建表、修改表、删除表、描述表元数据信息。
其中以建表语句为核心中的核心详见Hive
DDL建表语句。
可以说表的定义是否成功直接影响着数据能够成功映射进而影响是否可以顺利的使用Hive开展数据分析。
由于Hive建表之后加载映射数据很快实际中如果建表有问题可以不用修改直接删除重建。
如果指定了EXTENDED关键字则它将以Thrift序列化形式显示表的所有元数据。
如果指定了FORMATTED关键字则它将以表格格式显示元数据
如果已配置垃圾桶且未指定PURGE则该表对应的数据实际上将移动到HDFS垃圾桶而元数据完全丢失删除EXTERNAL表时该表中的数据不会从文件系统中删除只删除元数据如果指定了PURGE则表数据跳过HDFS垃圾桶直接被删除。
因此如果DROP失败则无法挽回该表数据
该操作仅更改表元数据。
现有数据的任何转换都必须在Hive之外进行。
---------------------------------
---------------------------------
---------------------------------
---------------------------------
---------------------------------
---------------------------------
---------------------------------
---------------------------------
---------------------------------
PARTITION会更改表元数据但不会加载数据。
如果分区位置中不存在数据查询时将不会返回结果。
因此需要保证增加的分区位置路径下数据已经存在或者增加完分区之后导入分区数据
/user/hive/warehouse/database_name.db/table_name/provincexxx;
Hive将每个表的分区列表信息存储在其metastore中。
但是如果将新分区直接添加到HDFS例如通过使用hadoop
-put命令或从HDFS中直接删除分区文件夹则除非用户ALTER
PARTITION在每个新添加的分区上运行命令否则metastore也就是Hive将不会意识到分区信息的这些更改。
MSCK是metastore
PARTITIONS使用此选项它将把HDFS上存在但元存储中不存在的所有分区添加到metastore。
DROP
PARTITIONS选项将从已经从HDFS中删除的metastore中删除分区信息。
SYNC
PARTITIONS。
如果存在大量未跟踪的分区则可以批量运行MSCK
创建一张分区表直接使用HDFS命令在表文件夹下创建分区文件夹并上传数据此时在Hive中查询是无法显示表数据的因为metastore中没有记录使用MSCK
PARTITIONS进行修复。
针对分区表直接使用HDFS命令删除分区文件夹此时在Hive中查询显示分区还在因为metastore中还没有被删除使用MSCK
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013/hero
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou
wangtingops01:/home/wangting/20221013/hero
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/
/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke
查看表的分区记录已经删除hdfs的rolesheshou但依旧可以查到
schemas;--2、显示当前数据库所有表/视图/物化视图/分区/索引
database_name];--4、显示当前数据库下所有物化视图
database_name];--5、显示表分区信息分区按字母顺序列出不是分区表执行该语句会报错
database_name.table_name;--7、显示表的属性信息
([db_name.]table_name|view_name);
table_name;--10、显示当前支持的所有自定义和内置的函数
Load英文单词的含义为加载、装载所谓加载是指将数据文件移动到与Hive表对应的位置移动时是纯复制、移动操作。
纯复制、移动指在数据load加载到表中时Hive不会对表中的数据内容进行任何转换任何操作
filepath表示待移动数据的路径。
可以指向文件在这种情况下Hive将文件移动到表中也可以指向中的所有文件移动到表中filepath文件路径支持下面三种形式要结合LOCAL关键字一起考虑
相对路径例如project/data1绝对路径例如/user/hive/project/data1具有schema的完整URI例如hdfs://host_ip:9000/user/hive/project/data1
若指定相对路径将相对于用户的当前工作目录进行解释用户也可以为本地文件指定完整的URI-例如file:///user/hive/project/data1
如果filepath指向的是一个完整的URI会直接使用这个URI如果没有指定schemaHive会使用在hadoop配置文件中参数fs.default.name指定的
则本地文件系统指的是Hiveserver2服务所在机器的本地Linux文件系统不是Hive客户端所在的本地文件系统
如果使用了OVERWRITE关键字则目标表或者分区中的已经存在的数据会被删除然后再将filepath指向的文件/目录中的内容添加到表/分区中
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
/home/wangting/20221013连接hive数据库操作并验证student_local表
/home/wangting/20221013/students.txt
]数据文件在服务器ops01上但是命令行连接hive的客户端是从另外一台服务器ops02上操作但是文件可以load所以load时beeline
wangting连接的是hive2协议机器为ops01那么INPATH路径则指的是ops01上的路径位置
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
Hive3.0load加载数据时除了移动、复制操作之外在某些场合下还会将加载重写为INSERT
SELECTHive3.0还支持使用inputformat、SerDe指定输入格式例如TextORC等
如果表具有分区则load命令没有指定分区则将load转换为INSERT
本来加载的时候没有指定分区语句是报错的但是文件的格式符合表的结构前两个是col1,col2,最后一个是分区字段col3则此时会将load语句转换成为insert
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
wangtingops01:/home/wangting/20221013
/home/wangting/20221013/tab1.txt
------------------------------------------------
------------------------------------------------
------------------------------------------------
------------------------------------
------------------------------------
------------------------------------
在MySQL这样的RDBMS中通常使用insertvalues的方式来向表插入数据并且执行速度很快insertvalues是RDBMS中表插入数据的核心方式
);假如把Hive当成RDBMS用insertvalues的方式插入数据会如何
如果在Hive中使用insertvalues对于大数据环境一条条插入数据用时相对RDBMS非常耗时
清洗数据成为结构化文件再使用Load语法加载数据到表中。
这样的效率更高
hive的insertselect表示将后面查询返回的结果作为内容插入到指定表中注意OVERWRITE将覆盖已有数据
需要保证查询结果列的数目和需要插入数据表格的列数目一致。
如果查询出来的数据类型和插入表格对应的列数据类型不一致将会进行转换但是不能保证转换一定成功转换失败的数据将会为NULL
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------
------------------------------------------------------
------------------------------------------------------
多重插入其核心功能是一次扫描多次插入语法目的就是减少扫描的次数在一次扫描中完成多次insert操作
old_table会扫描表之后insert执行均使用档次扫描结果
而如果使用以下传统方式则每次insert执行都将意味着扫描一次原表
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
-----------------------11-3.Dynamic
对于分区表的数据导入加载最基础的是通过load命令加载数据在load过程中分区值是手动指定写死的叫做静态分区
例如一张表对应的分区有几百个每个分区对应一个单独的映射文件那么使用load命令导入则会反复执行几百次
此时则需要有办法来处理这样的耗时操作那么需要引入一个动态分区插入的概念
分区的值是由后续的select查询语句的结果来动态确定的根据查询结果自动分区
hive.exec.dynamic.partition.mode
在strict模式下用户必须至少指定一个静态分区以防用户意外覆盖所有分区在nonstrict模式下允许所有分区都是动态的
原表student原表5个字段numnamesexagedept
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
创建一张新表student_partition,注意创建时是4个字段SnoSnameSexSage
hive.exec.dynamic.partition.modenonstrict
执行数据插入发现报错了报错内容意思为动态分区严格模式需要至少一个静态分区列。
要禁用此功能请设置hive.exec.dynamic.partition。
模式非严格nonstrict
hive.exec.dynamic.partition.mode
-------------------------------------------------------
-------------------------------------------------------
-------------------------------------------------------
Hive支持将select查询的结果导出成文件存放在文件系统中
写入文件系统的数据被序列化为文本列之间用\001隔开行之间用换行符隔开。
如果列都不是原始数据类型那么这些列将序列化为JSON格式。
也可以在导出的时候指定分隔符换行符和文件格式
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
--2、导出查询结果到HDFS指定目录下,并且指定分隔符和文件存储格式
--3、导出数据到本地文件系统指定目录下本地文件指连接的hive2服务所在的环境对应本地路径jdbc:hive2://ops01:10000则对应为ops01服务器对应的路径
/tmp/hive_export/20221018/000000_0
/tmp/hive_export/20221018/000000_0
/tmp/hive_export/20221019/000000_0
hive提供了工具orcfiledump可以查看解析hdfs的orc文件hive
/tmp/hive_export/20221019/000000_0
struct_col0:int,_col1:string,_col2:string,_col3:int,_col4:stringStripe
(OrcCodecPool.java:getCodec(56))
/home/wangting/hive_export/000000_0
Hive的核心目标是将已经存在的结构化数据文件映射成为表然后提供基于表的SQL分析处理是一款面向历史、面向分析的工具Hive作为数据仓库是分析数据规律的而不是创造数据规律的Hive中表的数据存储于HDFS上而HDFS是不支持随机修改文件数据的其常见的模型是一次写入多次读取
但从Hive0.14版本开始hive具有ACID语义的事务支持INSERTUPDATE和DELETE已添加到Hive中以解决以下场景下遇到的问题
Kafka之类的工具将数据流式传输到现有分区中可能会有脏读开始查询后能看到写入的数据
星型模式数据仓库中维度表随时间缓慢变化。
例如零售商将开设新商店需要将其添加到商店表中或者现有商店可能会更改其平方英尺或某些其他跟踪的特征。
这些更改需要插入单个记录或更新记录取决于所选策略
Hive的文件是存储在HDFS上的而HDFS上又不支持对文件的任意修改只能是采取另外的手段来完成
用HDFS文件作为原始数据基础数据用delta保存事务操作的记录增量数据正在执行中的事务是以一个staging开头的文件夹维护的执行结束就是delta文件夹。
每次执行一次事务操作都会有这样的一个delta增量文件夹当访问Hive数据时根据HDFS原始文件和delta增量文件做合并查询最新的数据
INSERT语句会直接创建delta的前缀是delete_deltaUPDATE语句采用了split-update特性即先删除、后插入
delta_minWID_maxWID_stmtID即delta前缀、写事务的ID范围、以及语句ID删除时前缀是delete_delta里面包含了要删除的文件
Hive会为写事务INSERT、DELETE等创建一个写事务IDWrite
_orc_acid_version的内容是2,即当前ACID版本号是2。
和版本1的主要区别是UPDATE语句采用了split-update特性即先删除、后插入。
这个文件不是ORC文件可以下载下来直接查看bucket_00000文件则是写入的数据内容。
如果事务表没有分区和分桶就只有一个这样的文件。
文件都以ORC格式存储底层二级制
表示删除。
由于使用了split-updateUPDATE是不会出现的所以delta文件中的operation是0
originalTransaction、currentTransaction该条记录的原始写事务ID当前的写事务ID。
row具体数据。
对于DELETE语句则为null对于INSERT就是插入的数据对于UPDATE就是更新后的数据
随着表的修改操作创建了越来越多的delta增量文件就需要合并以保持足够的性能。
合并器Compactor是一套在Hive
Metastore内运行支持ACID系统的后台进程。
所有合并都是在后台完成的不会阻止数据的并发读、写。
合并后系统将等待所有旧文件的读操作完成后删除旧文件。
合并操作分为两种minor
小合并会将一组delta增量文件重写为单个增量文件默认触发条件为10个delta文件大合并将一个或多个增量文件和基础文件重写为新的基础文件默认触发条件为delta文件相应于基础文件占比10%
虽然Hive支持了具有ACID语义的事务但是在使用起来并没有像在MySQL中使用那样方便有很多限制
尚不支持BEGINCOMMIT和ROLLBACK所有语言操作都是自动提交的表文件存储格式仅支持ORCSTORED
ORC需要配置参数开启事务使用外部表无法创建为事务表因为Hive只能控制元数据无法管理数据表属性参数transactional必须设置为true必须将Hive事务管理器设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager才能使用ACID表事务表不支持LOAD
hive.exec.dynamic.partition.mode
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;服务端
--在此metastore实例上运行多少个压缩程序工作线程12-4.案例创建使用Hive事务表
hive.exec.dynamic.partition.mode
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
---------------------------------
---------------------------------
---------------------------------
123456789101112131415161718192021222324252627282930
insert数据后查看映射文件目录为delta_0000001_0000001_0000
/user/hive/warehouse/hv_2022_10_13.db/emp
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000
因为再次插入数据后会有新的事务产生所以查看hdfs上映射变化多了一个映射文件目录delta_0000002_0000002_0000
/user/hive/warehouse/hv_2022_10_13.db/emp
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000/_orc_acid_version
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000/bucket_00000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000/_orc_acid_version
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000/bucket_00000
修改数据多了delta_0000003_0000003_0000和delete_delta_0000003_0000003_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/
/user/hive/warehouse/hv_2022_10_13.db/emp/delete_delta_0000003_0000003_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000003_0000003_0000
删除数据多了delete_delta_0000004_0000004_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/
/user/hive/warehouse/hv_2022_10_13.db/emp/delete_delta_0000003_0000003_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delete_delta_0000004_0000004_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000
/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000003_0000003_0000
Hive是基于Hadoop的数据仓库是面向分析支持分析工具。
将已有的结构化数据文件映射成为表然后提供SQL分析数据的能力因此在Hive中常见的操作就是分析查询select操作Hive早期是不支持update和delete语法的因为Hive所处理的数据都是已经存在的的数据、历史数据后续Hive支持了相关的update和delete操作不过有很多约束局限性
hive.exec.dynamic.partition.mode
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
hive.exec.dynamic.partition.mode
org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
从哪里查询取决于FROM关键字后面的table_reference。
可以是普通物理表、视图、join结果或子查询结果表名和列名不区分大小写
链接https://pan.baidu.com/s/1cWq6wd0pfqaCRuBijt1WKg?pwdcc6v
现有美国2021-1-28号各个县county的新冠疫情累计案例信息包括确诊病例和死亡病例数据格式如下所示
字段含义count_date统计日期,county县,state州,fips县编码code,cases累计确诊病例,deaths累计死亡病例
wangtingops01:/home/wangting/20221013/usa
wangtingops01:/home/wangting/20221013/usa
COVID-19-Cases-USA-By-County.csv
COVID-19-Cases-USA-By-State.csv
COVID-19-Deaths-USA-By-County.csv
COVID-19-Deaths-USA-By-State.csv
2021-01-28,Autauga,Alabama,01001,5554,69
2021-01-28,Baldwin,Alabama,01003,17779,225
2021-01-28,Barbour,Alabama,01005,1920,40
2021-01-28,Bibb,Alabama,01007,2271,51
2021-01-28,Blount,Alabama,01009,5612,98
2021-01-28,Bullock,Alabama,01011,1079,29
2021-01-28,Butler,Alabama,01013,1788,60
2021-01-28,Calhoun,Alabama,01015,11833,231
2021-01-28,Chambers,Alabama,01017,3159,76
2021-01-28,Cherokee,Alabama,01019,1682,35
,;--step2:将源数据load加载到t_usa_covid19表对应的路径下
/home/wangting/20221013/usa/us-covid19-counties.dat
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
--step2:使用动态分区插入将数据导入t_usa_covid19_p中
hive.exec.dynamic.partition.mode
county,fips,cases,deaths,count_date,state
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19/
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19/us-covid19-counties.dat
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28
wangtingops01:/home/wangting/20221013/usa
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateAlabama
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateAlaska
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateArizona
/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateArkansas14-2.Hive
如果没有给出这些选项则默认值为ALL返回所有匹配的行DISTINCT指定从结果集中删除重复的行
在WHERE表达式中可以使用Hive支持的任何函数和运算符但聚合函数除外
聚合函数要使用它的前提是结果集已经确定。
而where子句还处于“确定”结果集的过程中因而不能使用聚合函数
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
针对Hive分区表在查询时可以指定分区查询减少全表扫描也叫做分区裁剪所谓分区裁剪指对分区表进行查询时会检查WHERE子句或JOIN中的ON子句中是否存在对分区字段的过滤如果存在则仅访问查询符合条件的分区即裁剪掉没必要访问的分区
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
分组字段出现select_expr中一定没有歧义因为就是基于该字段分组的同一组中必相同被聚合函数应用的字段也没歧义因为聚合函数的本质就是多进一出最终返回一个结果
在SQL中增加HAVING子句原因是WHERE关键字无法与聚合函数一起使用HAVING子句可以让我们筛选分组后的各组数据,并且可以在Having中使用聚合函数因为此时wheregroup
having是在分组后对数据进行过滤where是在分组前对数据进行过滤having后面可以使用聚合函数where后面不可以使用聚合函数
LIMIT用于限制SELECT语句返回的行数LIMIT接受一个或两个数字参数这两个参数都必须是非负整数常量第一个参数指定要返回的第一行的偏移量第二个参数指定要返回的最大行数。
当给出单个参数时它代表最大行数并且偏移量默认为0
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
2,2表示从顺序为2开始的数据取2条即为第3条和第4条从0开始
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
聚合语句(sum,min,max,avg,count)要比having子句优先执行where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)
当底层使用MapReduce引擎执行的时候只会有一个reducetask执行。
如果输出的行数太大会导致需要很长的时间才能完成全局排序
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------CLUSTER
根据指定字段将数据分组每组内再根据该字段正序排序只能正序根据同一个字段分且排序
分组规则hash散列分桶表规则一样Hash_Func(col_name)
reducetask个数分为几组取决于reducetask的个数
BY更不能在这里使用因为是全局排序只有一个输出无法满足分的需求
by全局排序因此只有一个reducer结果输出在一个文件中当输入规模大时需要较长的计算时间distribute
by既有分组又有排序但是两个字段只能是同一个字段如果distribute和sort的字段是同一个时此时cluster
UNION用于将来自于多个SELECT语句的结果合并为一个结果集
使用DISTINCT关键字与只使用UNION默认值效果一样都会删除重复行。
1.2.0之前的Hive版本仅支持UNION
ALL在这种情况下不会消除重复的行使用ALL关键字不会删除重复行结果集包括所有SELECT语句的匹配行包括重复行每个select_statement返回的列的数量和名称必须相同
--使用DISTINCT关键字与使用UNION默认值效果一样都会删除重复行。
Hive支持任意级别的子查询也就是所谓的嵌套子查询子查询名称之前可以包含可选关键字AS
不相关子查询该子查询不引用父查询中的列可以将查询结果视为IN和NOT
执行子查询其结果不被显示而是传递给外部查询作为外层查询的条件使用
公用表表达式CTE是一个临时结果集该结果集是从WITH子句中指定的简单查询派生而来的紧接在SELECT或INSERT关键字之前CTE仅在单个语句的执行范围内定义CTE可以在
----------------------------------------------------
----------------------------------------------------
----------------------------------------------------
-----------------------------------------------
-----------------------------------------------
-----------------------------------------------
-----------------------------------------------
-----------------------------------------------
-----------------------------------------------
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback