SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

如何备案并推广企业以获得产地证?

96SEO 2026-02-19 09:22 0


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

如何备案并推广企业以获得产地证?

第1章:数据仓库基础理论

Warehouse简称数仓、DW,是一个用于存储、分析、报告的数据系统。

数据仓库的目的是构建面向分析的集成化数据环境分析结果为企业提供决策支持Decision

数据仓库本身并不“生产”任何数据其数据来源于不同外部系统同时数据仓库自身也不需要“消费”任何的数据其结果开放给各个外部应用使用这也是为什么叫“数据仓库”而不叫“数据工厂”的原因

1-2.场景案例数据仓库由来

中国人寿保险集团公司下辖多条业务线包括人寿险、财险、车险养老险等。

各业务线的业务正常运营需要记录维护包括客户、保单、收付费、核保、理赔等信息。

联机事务处理系统OLTP正好可以满足上述业务需求开展,

其主要任务是执行联机事务处理。

其基本特征是前台接收的用户数据可以立即传送到后台进行处理并在很短的时间内给出处理结果。

关系型数据库RDBMS是OLTP典型应用比如Oracle、MySQL、SQL

Server等

随着集团业务的持续运营业务数据将会越来越多。

由此也产生出许多运营相关的困惑

能够确定哪些险种正在恶化或已成为不良险种

为了能够正确认识这些问题最稳妥办法就是基于业务数据开展数据分析基于分析的结果给决策提供支撑。

也就是所谓的数据驱动决策的制定

OLTP系统的核心是面向业务支持业务支持事务。

所有的业务操作可以分为读、写两种操作一般来说读的压力明显大于写的压力。

如果在OLTP环境直接开展各种分析有以下问题需要考虑

数据分析也是对数据进行读取操作会让读取压力倍增OLTP仅存储数周或数月的数据数据分散在不同系统不同表中字段类型属性不统一

当分析所涉及数据规模较小的时候在业务低峰期时可以在OLTP系统上开展直接分析。

但是为了更好的进行各种规模的数据分析同时也不影响OLTP系统运行此时需要构建一个集成统一的数据分析平台。

该平台的目的很简单面向分析支持分析并且和OLTP系统解耦合。

基于这种需求数据仓库的雏形开始在企业中出现了

如数仓定义所说,数仓是一个用于存储、分析、报告的数据系统目的是构建面向分析的集成化数据环境。

我们把这种面向分析、支持分析的系统称之为OLAP联机分析处理系统数据仓库是OLAP一种。

中国人寿保险公司就可以基于分析决策需求构建数仓平台。

1-3.数据仓库主要特征

数据仓库目的是构建面向分析的集成化数据环境分析结果为企业提供决策支持Decision

Support。

数据仓库本身并不“生产”任何数据其数据来源于不同外部系统数据仓库自身也不需要“消费”任何的数据其结果开放给各个外部应用使用

面向主题

数据库中最大的特点是面向应用进行数据的组织各个业务系统可能是相互分离的。

而数据仓库则是面向主题的。

主题是一个抽象的概念是较高层次上企业信息系统中的数据综合、归类并进行分析利用的抽象。

在逻辑意义上它是对应企业中某一宏观分析领域所涉及的分析对象。

操作型处理传统数据对数据的划分并不适用于决策分析。

而基于主题组织的数据则不同它们被划分为各自独立的领域每个领域有各自的逻辑内涵但互不交叉在抽象层次上对数据进行完整、一致和准确的描述。

集成性

确定主题之后就需要获取和主题相关的数据。

当下企业中主题相关的数据通常会分布在多个操作型系统中彼此分散、独立、异构。

在数据进入数据仓库之前必然要经过统一与综合对数据进行抽取、清理、转换和汇总这一步是数据仓库建设中最关键、最复杂的一步所要完成的工作有

要统一源数据中所有矛盾之处如字段的同名异义、异名同义、单位不统一、字长不一致等等。

进行数据综合和计算。

数据仓库中的数据综合工作可以在从原有数据库抽取数据时生成但许多是在数据仓库内部生成的即进入数据仓库以后进行综合生成的。

下图说明了保险公司综合数据的简单处理过程其中数据仓库中与“承保”主题有关的数据来自于多个不同的操作型系统。

这些系统内部数据的命名可能不同数据格式也可能不同。

把不同来源的数据存储到数据仓库之前需要去除这些不一致

非易失性

数据仓库是分析数据的平台而不是创造数据的平台。

我们是通过数仓去分析数据中的规律而不是去创造修改其中的规律。

因此数据进入数据仓库后它便稳定且不会改变。

操作型数据库主要服务于日常的业务操作使得数据库需要不断地对数据实时更新以便迅速获得当前最新数据不至于影响正常的业务运作。

在数据仓库中只要保存过去的业务数据不需要每一笔业务都实时更新数据仓库而是根据商业需要每隔一段时间把一批较新的数据导入数据仓库。

数据仓库的数据反映的是一段相当长的时间内历史数据的内容是不同时点的数据库快照的集合以及基于这些快照进行统计、综合和重组的导出数据。

数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘一旦数据进入数据仓库以后一般情况下被较长时间保留。

数据仓库中一般有大量的查询操作但修改和删除操作很少。

时变性

数据仓库包含各种粒度的历史数据数据可能与某个特定日期、星期、月份、季度或者年份有关。

数据仓库的用户不能修改数据但并不是说数据仓库的数据是永远不变的。

分析的结果只能反映过去的情况当业务变化后挖掘出的模式会失去时效性。

因此数据仓库的数据需要随着时间更新以适应决策的需要。

从这个角度讲数据仓库建设是一个项目更是一个过程

数据仓库的数据时限一般要远远长于操作型数据的数据时限。

操作型系统存储的是当前数据而数据仓库中的数据是历史数据。

数据仓库中的数据是按照时间顺序追加的它们都带有时间属性。

1-4.数据仓库、数据库、数据集市

Processing主要目标是做数据处理它是针对具体业务在数据库联机的日常操作通常对少数记录进行查询、修改。

用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。

传统的关系型数据库系统RDBMS作为数据管理的主要手段主要用于操作型处理。

OLAP

Processing主要目标是做数据分析。

一般针对某些主题的历史数据进行复杂的多维分析支持管理决策。

数据仓库是OLAP系统的一个典型示例主要用于数据分析。

数据仓库、数据库区别

数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别。

OLTP系统的典型应用就是RDBMS,也就是我们俗称的数据库当然这里要特别强调此数据库表示的是关系型数据库Nosql数据库并不在讨论范围内。

OLAP系统的典型应用就是DW,也就是我们俗称的数据仓库。

数据仓库不是大型的数据库虽然数据仓库存储数据规模大。

数据仓库的出现并不是要取代数据库。

数据库是面向事务的设计数据仓库是面向主题设计的。

数据库一般存储业务数据数据仓库存储的一般是历史数据。

数据库是为捕获数据而设计数据仓库是为分析数据而设计。

数据仓库、数据集市区别

是面向单个部门使用的。

可以认为数据集市是数据仓库的子集也有把数据集市叫做小型数据仓库。

数据集市通常只涉及一个主题领域例如市场营销或销售。

因为它们较小且更具体所以它们通常更易于管理和维护并具有更灵活的结构。

下图中各种操作型系统数据和包括文件在内的等其他数据作为数据源经过ETL(抽取转换加载)填充到数据仓库中数据仓库中有不同主题数据数据集市则根据部门特点面向指定主题比如Purchasing采购、Sales销售、Inventory库存用户可以基于主题数据开展各种应用数据分析、数据报表、数据挖掘。

1-5.数据仓库分层架构

数据仓库的特点是本身不生产数据也不最终消费数据。

按照数据流入流出数仓的过程进行分层就显得水到渠成。

每个企业根据自己的业务需求可以分成不同的层次。

但是最基础的分层思想理论上分为三个层操作型数据层ODS、数据仓库层(DW)和数据应用层(DA)。

企业在实际运用中可以基于这个基础分层之上添加新的层次来满足不同的业务需求

阿里巴巴数仓3层架构介绍

为了更好的理解数据仓库分层的思想以及每层的功能意义下面结合阿里巴巴提供出的数仓分层架构图进行分析。

阿里数仓是非常经典的3层架构从下往上依次是ODS、DW、DA。

通过元数据管理和数据质量监控来把控整个数仓中数据的流转过程、血缘依赖关系和生命周期。

ODS层Operation

操作型数据层也称之为源数据层、数据引入层、数据暂存层、临时缓存层。

此层存放未经过处理的原始数据至数据仓库系统结构上与源系统保持一致是数据仓库的数据准备区。

主要完成基础数据引入到数仓的职责和数据源系统进行解耦合同时记录基础数据的历史变化。

DW层Data

数据仓库层由ODS层数据加工而成。

主要完成数据加工与整合建立一致性的维度构建可复用的面向分析和统计的明细事实表以及汇总公共粒度的指标。

内部具体划分如下

公共维度层DIM基于维度建模理念思想建立整个企业一致性维度。

公共汇总粒度事实层DWS、DWB以分析的主题对象作为建模驱动基于上层的应用和产品的指标需求构建公共粒度的汇总指标事实表以宽表化手段物理化模型明细粒度事实层DWD:

DA层或ADS层

数据应用层面向最终用户面向业务定制提供给产品和数据分析使用的数据。

包括前端报表、分析图表、KPI、仪表盘、OLAP专题、数据挖掘等分析。

数据仓库分层优点

每一个数据分层都有它的作用域在使用表的时候能更方便地定位和理解。

数据血缘追踪

简单来说我们最终给业务呈现的是一个能直接使用业务表但是它的来源有很多如果有一张来源表出问题了我们希望能够快速准确地定位到问题并清楚它的危害范围。

减少重复开发

将一个复杂的任务分解成多个步骤来完成每一层只处理单一的步骤比较简单和容易理解。

而且便于维护数据的准确性当数据出现问题之后可以不用修复所有的数据只需要从有问题的步骤开始修复。

ETL、ELT区别

数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL抽取Extra,

转化Transfer,

但是在实际操作中将数据加载到仓库却产生了两种不同做法ETL和ELT。

ETL

首先从数据源池中提取数据这些数据源通常是事务性数据库。

数据保存在临时暂存数据库中ODS。

然后执行转换操作将数据结构化并转换为适合目标数据仓库系统的形式。

然后将结构化数据加载到仓库中以备分析。

ELT

使用ELT数据在从源数据池中提取后立即加载。

没有专门的临时数据库ODS这意味着数据会立即加载到单一的集中存储库中。

数据在数据仓库系统中进行转换以便与商业智能工具BI工具一起使用。

大数据时代的数仓这个特点很明显。

第2章:Apache

Hive是一款建立在Hadoop之上的开源数据仓库系统可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表基于表提供了一种类似SQL的查询模型称为Hive查询语言HQL用于访问和分析存储在Hadoop文件中的大型数据集。

Hive核心是将HQL转换为MapReduce程序然后将程序提交到Hadoop群集执行。

Hive由Facebook实现并开源。

为什么使用Hive

人员学习成本太高需要掌握java语言MapReduce实现复杂查询逻辑开发难度太大

操作接口采用类SQL语法提供快速开发的能力简单、容易上手避免直接写MapReduce减少开发人员的学习成本支持自定义函数功能扩展很方便背靠Hadoop擅长存储分析海量数据集

Hive和Hadoop关系

Hive作为一款大数据时代的数据仓库软件当然也具备上述两种能力。

只不过Hive并不是自己实现了上述两种能力而是借助Hadoop。

Hive利用Hadoop的HDFS存储数据利用Hadoop的MapReduce查询分析数据。

这样突然发现Hive没啥用不过是套壳Hadoop罢了。

其实不然Hive的最大的魅力在于用户专注于编写HQLHive帮您转换成为MapReduce程序完成对数据的分析。

2-2.Apache

CLI、JDBC/ODBC、WebGUI。

其中CLI(command

line

interface)为shell命令行Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互类似于JDBC或ODBC协议。

WebGUI是通过浏览器访问Hive

元数据存储

中的元数据包括表的名字表的列和分区及其属性表的属性是否为外部表等表的数据所在目录等

Driver驱动程序

查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。

生成的查询计划存储在

HDFS

Hive本身并不直接处理数据文件。

而是通过执行引擎处理。

当下Hive支持MapReduce、Tez、Spark3种执行引擎

2-3.Apache

数据模型用来描述数据、组织数据和对数据进行操作是对现实世界数据特征的描述。

、Hive的数据模型类似于RDBMS库表结构此外还有自己特有模型。

Hive中的数据可以在粒度级别上分为三类

Table

Hive作为一个数据仓库在结构上积极向传统数据库看齐也分数据库Schema每个数据库下面有各自的表组成。

默认数据库default。

Hive的数据都是存储在HDFS上的默认有一个根目录在hive-site.xml中由参数hive.metastore.warehouse.dir指定。

默认值为/user/hive/warehouse。

因此如果没有设置特定路径那么Hive中的数据库在HDFS上的存储路径为/user/hive/warehouse/databasename.db

Tables

Hive表与关系数据库中的表相同。

Hive中的表所对应的数据通常是存储在HDFS中而表相关的元数据是存储在RDBMS中。

Hive中的表的数据在HDFS上的存储路径为/user/hive/warehouse/databasename.db/tablename

Partitions

Partition分区是hive的一种优化手段表。

分区是指根据分区列例如“日期day”的值将表划分为不同分区。

这样可以更快地对指定分区数据进行查询。

分区在存储层面上的表现是:table表目录下以子文件夹形式存在。

一个文件夹表示一个分区。

子文件命名标准分区列分区值Hive还支持分区下继续创建分区所谓的多重分区。

关于分区表的使用和详细介绍后面模块会单独展开。

Buckets

Bucket分桶表是hive的一种优化手段表。

分桶是指根据表中字段例如“编号ID”的值,经过hash计算规则将数据文件划分成指定的若干个小文件。

分桶规则hashfunc(字段)

桶个数余数相同的分到同一个文件。

分桶的好处是可以优化join查询和方便抽样查询。

Bucket分桶表在HDFS中表现为同一个表目录下数据根据hash散列之后变成多个文件。

2-4.Apache

Hive虽然具有RDBMS数据库的外表包括数据模型、SQL语法都十分相似但hive应用场景和MySQL却完全不同。

Hive只适合用来做海量数据的离线分析。

Hive的定位是数据仓库面向分析的OLAP系统。

Hive不是大型数据库也无法取代MySQL承担业务数据处理。

第3章:Apache

元数据Metadata又称中介数据、中继数据为描述数据的数据data

about

data主要是描述数据属性property的信息用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

Hive

Metadata即Hive的元数据。

包含用Hive创建的database、table、表的位置、类型、属性字段顺序类型等元信息。

元数据存储在关系型数据库中。

如hive内置的Derby、或者第三方如MySQL等。

Hive

Metastore即元数据服务。

Metastore服务的作用是管理metadata元数据对外暴露服务地址让各种客户端通过连接metastore服务由metastore再去连接MySQL数据库来存取元数据。

有了metastore服务就可以有多个客户端同时连接而且这些客户端不需要知道MySQL数据库的用户名和密码只需要连接metastore

3-2.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

Network

API进行通信。

远程模式下需要配置hive.metastore.uris

参数来指定metastore服务运行的机器ip和端口并且需要单独手动启动metastore服务。

元数据也采用外部数据库来存储元数据推荐使用MySQL。

在生产环境中建议用远程模式来配置Hive

Metastore。

在这种情况下其他依赖hive的软件都可以通过Metastore访问hive。

由于还可以完全屏蔽数据库层因此这也带来了更好的可管理性/安全性。

3-3.Apache

Hive是一款基于Hadoop的数据仓库软件通常部署运行在Linux系统之上。

因此不管使用何种方式配置Hive

Metastore必须要先保证服务器的基础环境正常Hadoop集群健康可用。

服务器基础环境

集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装Hadoop集群健康可用

启动Hive之前必须先启动Hadoop集群。

特别要注意需等待HDFS安全模式关闭之后再启动运行Hive。

Hive不是分布式安装运行的软件其分布式的特性主要借由Hadoop完成。

包括分布式存储、分布式计算。

如果还没有hadoop集群可以参考另一篇hadoop文章进行准备

hadoop集群准备

https://blog.csdn.net/wt334502157/article/details/114916871

hive3安装部署

https://blog.csdn.net/wt334502157/article/details/115419462

由于篇幅原因hive3.1.2的详细安装部署步骤可以参考hive安装部署文章

本篇幅会讲重要点标注

链接https://pan.baidu.com/s/1kPr0uTEXqslxZ3v_r-uLQQ

提取码bi8x

上传安装包MySQL安装MySQL配置hive安装配置Metastore到MySql修改hadoop环境变量解决jar包冲突启动hive启动前处理guava的jar包冲突

3-4.Apache

第一代客户端deprecated不推荐使用$HIVE_HOME/bin/hive,

shellUtil。

主要功能一是可用于以交互或批处理模式运行Hive查询二是用于Hive相关服务的启动比如metastore服务。

第二代客户端recommended

推荐使用$HIVE_HOME/bin/beeline是一个JDBC客户端是官方强烈推荐使用的Hive命令行工具和第一代客户端相比性能加强安全性提高。

Thrift

HiveServer2服务上这也是官方推荐在生产环境中使用的模式

bin/hive客户端

bin/hive。

该客户端可以访问hive的metastore服务从而达到操作hive的目的。

需要启动运行metastore服务。

可以直接在启动Hive

metastore服务的机器上使用bin/hive客户端操作此时不需要进行任何配置。

bin/beeline客户端

hive经过发展推出了第二代客户端beeline但是beeline客户端不是直接访问metastore服务的而是需要单独启动hiveserver2服务在hive安装的服务器上首先启动metastore服务然后启动hiveserver2服务Beeline是JDBC的客户端通过JDBC协议和Hiveserver2服务进行通信协议的地址是jdbc:hive2://ip:port

beeline

12345678910111213141516171819202122232425HiveServer和HiveServer2服务

HiveServer、HiveServer2都是Hive自带的两种服务允许客户端在不启动CLI命令行的情况下对Hive中的数据进行操作且两个都允许远程客户端使用多种编程语言如javapython等向hive提交请求取回结果。

HiveServer不能处理多于一个客户端的并发请求。

因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2进而解决了该问题。

HiveServer已经被废弃。

HiveServer2支持多客户端的并发和身份认证旨在为开放API客户端如JDBC、ODBC提供更好的支持。

Hive服务和客户端

HiveServer2通过Metastore服务读写元数据。

所以在远程模式下启动HiveServer2之前必须先首先启动metastore服务远程模式下Beeline客户端只能通过HiveServer2服务访问Hive。

而bin/hive是通过Metastore服务访问

第4章:场景案例Apache

按照MySQL的思维在hive中创建、切换数据库创建表并执行插入数据操作最后查询是否插入成功

beeline

command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e):

create

command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e);

Time

command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e):

create

command(queryIdwangting_20221013160018_4a1ad7d6-b66b-4e9d-b7e9-e6f602e24e5e);

Time

command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea):

show

Schema(fieldSchemas:[FieldSchema(name:database_name,

type:string,

command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea);

Time

command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea):

show

command(queryIdwangting_20221013160105_5dfea58b-e0df-4354-b7c1-33115306e2ea);

Time

12345678910111213141516171819进入数据库

进入数据库

command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb):

use

command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb);

Time

command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb):

use

command(queryIdwangting_20221013160126_1e501f53-09ee-4baf-8ef5-8e63079ea4eb);

Time

command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78):

create

command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78);

Time

command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78):

create

command(queryIdwangting_20221013160614_888f8325-7559-4a1a-ae0b-a58f81d42b78);

Time

command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b):

insert

Schema(fieldSchemas:[FieldSchema(name:_col0,

type:int,

command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b);

Time

command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b):

insert

wangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b

INFO

hive.exec.reducers.bytes.per.reducernumber

INFO

http://ops02:8088/proxy/application_1615531413182_10785/

INFO

http://ops02:8088/proxy/application_1615531413182_10785/

INFO

/opt/module/hadoop-3.1.3/bin/mapred

job

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

from

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

INFO

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

INFO

command(queryIdwangting_20221013160708_4f681b20-e521-4c4e-8fce-c1b7a68a8c9b);

Time

最终插入一条数据历史37.266秒的时间。

查询表数据显示数据插入成功

查询表数据

command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994):

select

Schema(fieldSchemas:[FieldSchema(name:t_student.id,

type:int,

FieldSchema(name:t_student.name,type:varchar(255),

comment:null)],

command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994);

Time

command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994):

select

command(queryIdwangting_20221013162317_8bdee041-dcb8-421f-b122-c0eaf65b7994);

Time

--------------------------------

t_student.id

--------------------------------

allen

--------------------------------

row

HDFS浏览文件系统根据Hive的数据模型表的数据最终是存储在HDFS和表对应的文件夹下的

Hive

SQL语法和标准SQL很类似Hive底层是通过MapReduce执行的数据插入动作,所以速度慢。

如果大数据集这么一条一条插入的话是非常不现实的时间成本极高。

Hive应该具有自己特有的数据插入表方式结构化文件映射成为表。

HDFS上传映射文件

在HDFS根目录下创建一个结构化数据文件user.txt里面内容如下

mkdir

wangtingops01:/home/wangting/20221013

vim

6,tony,26,beijingwangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

在hive中创建一张表t_user。

注意字段的类型顺序要和文件中字段保持一致。

create

command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d):

create

command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d);

Time

command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d):

create

command(queryIdwangting_20221013172003_f3c0cd33-b145-4768-9c78-d2f5d177c43d);

Time

command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15):

select

Schema(fieldSchemas:[FieldSchema(name:t_user.id,

type:int,

type:varchar(255),comment:null),

type:int,

command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15);

Time

command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15):

select

command(queryIdwangting_20221013172211_e9eb3b6b-5ea6-4d5f-92d5-41c60c4e3d15);

Time

-----------------------------------------------------

t_user.id

-----------------------------------------------------

-----------------------------------------------------

rows

执行数据查询操作发现表中并没有数据说明创建的t_user表和user.txt并没有形成映射关系

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_user

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_user

Found

/user/hive/warehouse/hv_2022_10_13.db/t_user/user.txt

再次查看表中内

command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18):

select

Schema(fieldSchemas:[FieldSchema(name:t_user.id,

type:int,

type:varchar(255),comment:null),

type:int,

command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18);

Time

command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18):

select

command(queryIdwangting_20221013172615_aff07cff-130a-4698-82e6-7e847f479d18);

Time

-----------------------------------------------------

t_user.id

-----------------------------------------------------

NULL

-----------------------------------------------------

rows

seconds)再次执行查询操作值都是null说明感知到文件但是并没有把内容一一对应起来

建新表t_user_1指定分隔符

command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c):

create

command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c);

Time

command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c):

create

command(queryIdwangting_20221013173054_8ddcc8a6-d690-4eda-adb7-0788629ba15c);

Time

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_user_1/

2022-10-13

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_user_1/user.txt

2022-10-13

6,tony,26,beijing查询新表t_user_1内容

select

command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6):

select

Schema(fieldSchemas:[FieldSchema(name:t_user_1.id,

type:int,

FieldSchema(name:t_user_1.name,

type:varchar(255),

FieldSchema(name:t_user_1.city,

type:varchar(255),

command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6);

Time

command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6):

select

command(queryIdwangting_20221013173328_ee6745df-ca06-4433-9960-632250ccc5a6);

Time

-------------------------------------------------------------

t_user_1.id

-------------------------------------------------------------

zhangsan

-------------------------------------------------------------

rows

此时再创建一张表t_user_2保存分隔符语法但是故意使得字段类型和文件中不一致,测试一下字段约束类型不符会如何

create

command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad):

create

command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad);

Time

command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad):

create

command(queryIdwangting_20221013173540_c4d0759d-5120-4e77-bd1f-9cae820d5cad);

Time

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_user_2/查询新表t_user_2内容

select

command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f):

select

Schema(fieldSchemas:[FieldSchema(name:t_user_2.id,

type:int,

FieldSchema(name:t_user_2.name,

type:int,

FieldSchema(name:t_user_2.city,

type:varchar(255),

command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f);

Time

command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f):

select

command(queryIdwangting_20221013173648_048fa03f-beb9-4387-bc09-e6062d79170f);

Time

-------------------------------------------------------------

t_user_2.id

-------------------------------------------------------------

NULL

-------------------------------------------------------------

rows

seconds)此时发现有的列name显示null有的列显示正常

name字段本身是字符串但是建表的时候指定int类型转换不成功age是数值类型建表指定字符串类型可以转换成功。

说明hive中具有自带的类型转换功能但是不一定保证转换成功

要想在hive中创建表跟结构化文件映射成功需要注意以下几个方面问题

创建表时字段顺序、字段类型要和文件中保持一致。

如果类型不一致hive会尝试转换但是不保证转换成功。

不成功显示null。

select

command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e):

select

Schema(fieldSchemas:[FieldSchema(name:_c0,

type:bigint,

command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e);

Time

command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e):

select

wangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e

INFO

hive.exec.reducers.bytes.per.reducernumber

INFO

http://ops02:8088/proxy/application_1615531413182_10786/

INFO

http://ops02:8088/proxy/application_1615531413182_10786/

INFO

/opt/module/hadoop-3.1.3/bin/mapred

job

command(queryIdwangting_20221013174512_2ec3e4c9-bafe-40fd-9a4c-367dbf1d899e);

Time

seconds)从控制台输出可以发现又是通过MapReduce程序执行的数据查询功能

Hive底层的确是通过MapReduce执行引擎来处理数据的执行完一个MapReduce程序需要的时间较长如果是小数据集使用hive进行分析将得不偿失延迟很高如果是大数据集使用hive进行分析底层MapReduce分布式计算

后续章前准备工作

准备工作可以根据情况选择是否准备大部分语句可以通过命令行客户端去执行推荐使用开发环境去熟悉。

IntelliJ

IDEA是JetBrains公司的产品是java编程语言开发的集成环境。

在业界被公认为最好的java开发工具尤其在智能代码助手、代码自动提示、重构、代码分析、

IntelliJ

还有丰富的插件其中就内置集成了Database插件支持操作各种主流的数据库、数据仓库

创建一个maven项目

链接https://pan.baidu.com/s/14Pl4KnqjGj0nf05d7JSrxw?pwdkfud

提取码kfud

DDL)是SQL语言集中对数据库内部的对象结构进行创建删除修改等的操作语言这些数据库对象包括databaseschema、table、view、index等。

DDL核心语法由CREATE、ALTER与DROP三个所组成。

DDL并不涉及表内部数据的操作。

在某些上下文中该术语也称为数据描述语言因为它描述了数据库表中的字段和记录。

Hive

SQLHQL与标准SQL的语法大同小异基本相通注意差异即可基于Hive的设计、使用特点HQL中create语法尤其create

建表是否成功直接影响数据文件是否映射成功进而影响后续是否可以基于SQL分析数据。

第6章:Hive

(property_nameproperty_value,...)]

[STORED

SQL中数据类型英文字母大小写不敏感除SQL数据类型外还支持Java数据类型比如字符串string复杂数据类型的使用通常需要和分隔符指定语法配合使用如果定义的数据类型和文件不一致Hive会尝试隐式转换但是不保证成功。

隐式转换

与标准SQL类似HQL支持隐式和显式类型转换。

原生类型从窄类型到宽类型的转换称为隐式转换反之则不允许

显示转换

SerDe是Serializer、Deserializer的简称目的是用于序列化和反序列化。

序列化是对象转化为字节码的过程而反序列化是字节码转换为对象的过程。

Hive使用SerDe包括FileFormat读取和写入表行对象。

需要注意的是“key”部分在读取时会被忽略而在写入时key始终是常数。

基本上行对象存储在“value”中。

Read:

--------------------------------------------------------------------------------------------------------

col_name

--------------------------------------------------------------------------------------------------------

Storage

org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

NULL

org.apache.hadoop.mapred.TextInputFormat

NULL

org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

NULL

Hive读取文件机制首先调用InputFormat默认TextInputFormat返回一条一条kv键值对记录默认是一行对应一条键值对。

然后调用SerDe默认LazySimpleSerDe的Deserializer将一条记录中的value根据分隔符切分为各个字段。

Hive写文件机制将Row写入文件时首先调用SerDe默认LazySimpleSerDe的Serializer将对象转换成字节序列然后调用OutputFormat将数据写入HDFS文件中

SerDe相关语法

FORMAT这一行所代表的是跟读写文件、序列化SerDe相关的语法功能有二

其中ROW

FORMAT是语法关键字DELIMITED和SERDE二选其一。

如果使用delimited表示使用默认的LazySimpleSerDe类来处理数据。

FORMAT

serde_name指定其他的Serde类来处理数据,甚至支持用户自定义SerDe类。

LazySimpleSerDe分隔符指定

LazySimpleSerDe是Hive默认的序列化类包含4种子语法分别用于指定字段之间、集合元素之间、map映射

Hive默认分隔符

默认的分割符是’\001’是一种特殊的字符使用的是ASCII编码的值键盘是打不出来的

在vim编辑器中连续按下Ctrlv/Ctrla即可输入’\001’

下载一个hdfs映射文件

wangtingops01:/home/wangting/20221013

hdfs

/water_bill/output_ept_10W_export_0817/part-m-00000

wangtingops01:/home/wangting/20221013

total

wangtingops01:/home/wangting/20221013

head

SEQ1org.apache.hadoop.hbase.io.ImmutableBytesWritable%org.apache.hadoop.hbase.client.Result8u

0000132

wangtingops01:/home/wangting/20221013

vim

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室

ÿ8d80949f.(^D2

^G0000132^R^BC1^Z^LNUM_PREVIOUS

6-4.Hive数据存储路径

Hive表默认存储路径是由${HIVE_HOME}/conf/hive-site.xml配置文件的hive.metastore.warehouse.dir属性指定默认值是/user/hive/warehouse

指定存储路径

在Hive建表的时候可以通过location语法来更改数据在HDFS上的存储路径使得建表加载数据更加灵活方便

语法LOCATION

对于已经生成好的数据文件使用location指定路径将会很方便

案例相关数据素材文件均在

https://osswangting.oss-cn-shanghai.aliyuncs.com/hive/honor_of_kings.zip

案例1

文件archer.txt中记录了手游《王者荣耀》射手的相关信息包括生命、物防、物攻等属性信息其中字段之间分隔符为制表符\t,要求在Hive中建表映射成功该文件

archer.txt

assassin字段含义id、name英雄名称、hp_max最大生命、mp_max最大法力、attack_max最高物攻、defense_max最大物防、attack_range攻击范围、role_main主要定位、role_assist次要定位。

字段都是基本类型字段的顺序需要注意。

字段之间的分隔符是制表符需要使用row

format语法进行指定

\t;建表成功之后在Hive的默认存储路径下就生成了表对应的文件夹

wangtingops01:/home/wangting/20221013

archer.txt

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_archer查数验证

核心语法row

文件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之间分隔符

--集合元素kv之间分隔符;建表成功之后在Hive的默认存储路径下就生成了表对应的文件夹

把hot_hero_skin_price.txt文件上传到对应的表文件夹下

wangtingops01:/home/wangting/20221013

archer.txt

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_hot_hero_skin_price查数验证

案例3

文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息字段之间使用的是\001作为分隔符,要求在Hive中建表映射成功该文件

team_ace_player.txt

有不可见字符自行下载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

archer.txt

文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息字段之间使用的是\001作为分隔符。

要求把文件上传到HDFS任意路径下不能移动复制并在Hive中建表映射成功该文件

相当于指定数据存储路径

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

table。

默认情况下创建的表就是内部表Hive拥有该表的结构和文件。

换句话说Hive完全管理表元数据和数据的生命周期类似于RDBMS中的表。

当删除内部表时会删除数据以及表的元数据

FORMATTED

tablename,来获取表的元数据描述信息从中可以看出表的类型

Table

table中的数据不是Hive拥有或管理的只管理表元数据的生命周期。

要创建一个外部表需要使用EXTERNAL语法关键字。

删除外部表只会删除元数据而不会删除实际数据。

在Hive外部仍然可以访问实际数据。

实际场景中外部表搭配location语法指定数据的路径可以让数据更安全

FORMATTED

tablename,来获取表的元数据描述信息从中可以看出表的类型

Table

Metastore中管理表定义、字段类型等元数据信息。

删除内部表时除了会从Metastore中删除表元数据还会从HDFS中删除其所有数据文件。

删除外部表时只会从Metastore中删除表的元数据并保持HDFS位置中的实际数据不变。

如何选择内、外部表

当需要通过Hive完全管理控制表的整个生命周期时请使用内部表。

当数据来之不易防止误删请使用外部表因为即使删除表文件也会被保留。

案例验证内部表、外部表区别

wangtingops01:/home/wangting/20221013

archer.txt

wangtingops01:/home/wangting/20221013

cat

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

/20221014/out/t_user_out查询数据验证结果

select

-----------------------------------------------------------------

t_user_in.id

-----------------------------------------------------------------

zhangsan

-----------------------------------------------------------------

rows

---------------------------------------------------------------------

t_user_out.id

---------------------------------------------------------------------

zhangsan

---------------------------------------------------------------------

rows

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

/20221014/out/t_user_out将内外表删除drop

drop

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

/20221014/out/t_user_out内部表drop删除后hdfs上的/20221014/in/t_user_in文件已经同步被删除

外部表drop删除后hdfs上的/20221014/out/t_user_out文件依旧还在hdfs上

7-2.Hive

当Hive表对应的数据量大、文件个数多时为了避免查询时全表扫描数据Hive支持根据指定的字段对表进行分区分区的字段可以是日期、地域、种类等具有标识意义的字段。

例如把一整年的数据根据月份划分12个月12个分区后续就可以查询指定月份分区的数据尽可能避免了全表扫描查询

创建分区表语法

分区字段不能是表中已经存在的字段因为分区字段最终也会以虚拟字段的形式显示在表结构上

关键词PARTITIONED

针对《王者荣耀》英雄数据创建一张分区表t_all_hero_part以role角色作为分区字段

执行建表语句

------------------------------------------------

col_name

------------------------------------------------

int

------------------------------------------------

rows

wangtingops01:/home/wangting/20221013/hero

archer.txt

wangtingops01:/home/wangting/20221013/hero

beeline

/home/wangting/20221013/hero/archer.txt

into

/home/wangting/20221013/hero/assassin.txt

into

/home/wangting/20221013/hero/mage.txt

into

/home/wangting/20221013/hero/support.txt

into

/home/wangting/20221013/hero/tank.txt

into

/home/wangting/20221013/hero/warrior.txt

into

外表上看起来分区表好像没多大变化只不过多了一个分区字段。

实际上分区表在底层管理数据的方式发生了改变。

这里直接去HDFS查看区别

wangtingops01:/home/wangting/20221013/hero

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part

Found

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolecike

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolefashi

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolefuzhu

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolesheshou

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/roletanke

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part/rolezhanshi

12345678分区的概念提供了一种将Hive表数据分离为多个文件/目录的方法。

不同分区对应着不同的文件夹同一分区的数据存储在同一个文件夹下。

查询过滤的时候只需要根据分区值找到对应的文件夹扫描本文件夹下本分区下的文件即可避免全表数据扫描。

这种指定分区查询的方式叫做分区裁剪。

建表时根据业务场景设置合适的分区字段。

比如日期、地域、类别等查询的时候尽量先使用where进行分区过滤查询指定分区的数据避免全表扫描。

比如查询英雄主要定位是射手并且最大生命大于6000的个数。

使用分区表查询和使用非分区表进行查询

英雄为射手

通过建表语句中关于分区的相关语法可以发现Hive支持多个分区字段

PARTITIONED

多重分区下分区之间是一种递进关系可以理解为在前一个分区的基础上继续分区从HDFS的角度来看就是文件夹下继续划分子文件夹。

比如把全国人口数据首先根据省进行分区然后根据市进行划分如果你需要甚至可以继续根据区县再划分此时就是3分区表

创建多重分区表示例

t_user_province_citypartition(provincezhejiang,cityhangzhou);

load

t_user_province_citypartition(provincezhejiang,cityningbo);

load

t_user_province_citypartition(provinceshanghai,citypudong);--双分区表的使用

减少全表扫描

所谓动态分区指的是分区的字段值是基于查询结果参数位置自动推断出来的。

核心语法就是insertselect启用hive动态分区需要在hive会话中设置两个参数

set

hive.exec.dynamic.partitiontrue;

set

hive.exec.dynamic.partition.modenonstrict;

指定动态分区模式分为nonstick非严格模式和strict严格模式。

strict严格模式要求至少有一个分区为静态分区。

创建一张新的分区表执行动态分区插入。

动态分区插入时分区值是根据查询返回字段位置自动推断的

创建动态分区示例

wangtingops01:/home/wangting/20221013/hero

archer.txt

wangtingops01:/home/wangting/20221013/hero

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero

2022-10-14

hive.exec.dynamic.partitiontrue;

rows

hive.exec.dynamic.partition.modenonstrict;

rows

分区表不是建表的必要语法规则是一种优化手段表可选分区字段不能是表中已有的字段不能重复分区字段是虚拟字段其数据并不存储在底层的文件中分区字段值的确定来自于用户价值数据手动指定静态分区或者根据查询结果位置自动推断动态分区Hive支持多重分区也就是说在分区的基础上继续分区划分更加细粒度

7-3.Hive

分桶表也叫做桶表叫法源自建表语法中bucket单词是一种用于优化查询而设计的表类型。

分桶表对应的数据文件在底层会被分解为若干个部分通俗来说就是被拆分成若干个独立的小文件。

在分桶时要指定根据哪个字段将数据分为几桶几个部分。

分桶规则

hash_function(bucketing_column)

mod

12hash_function取决于分桶字段bucketing_column的类型

int;如果是其他比如bigint,string或者复杂数据类型hash_function比较棘手将是从该类型派生的某个数字比如hashcode值。

分桶表语法

BUCKETS表示分为几桶也就是几个部分需要注意的是分桶的字段必须是表中已经存在的字段

数据集文件连接

链接https://pan.baidu.com/s/1cWq6wd0pfqaCRuBijt1WKg?pwdcc6v

提取码cc6v

wangtingops01:/home/wangting/20221013/usa

unzip

wangtingops01:/home/wangting/20221013/usa

total

COVID-19-Cases-USA-By-County.csv

-rw-rw-r--

COVID-19-Cases-USA-By-State.csv

-rw-rw-r--

COVID-19-Deaths-USA-By-County.csv

-rw-rw-r--

COVID-19-Deaths-USA-By-State.csv

-rw-rw-r--

现有美国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桶建表语句如下

CREATE

t_usa_covid19_bucket(count_date

string,county

t_usa_covid19_bucket_sort(count_date

string,county

123456789把源数据加载到普通hive表中创建普通表t_usa_covid19

CREATE

12345678将映射文件上传hdfs对应普通表t_usa_covid19

将源数据上传到HDFSt_usa_covid19表对应的路径下

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19

select

------------------------------------------------------------------------------------------------------------------------------------------

t_usa_covid19.county

------------------------------------------------------------------------------------------------------------------------------------------

2021-01-28

------------------------------------------------------------------------------------------------------------------------------------------

rows

seconds)使用insertselect语法将数据加载到分桶表t_usa_covid19_bucket中:

insert

12到HDFS上查看t_usa_covid19_bucket底层数据结构可以发现数据被分为了5个部分。

并且从结果可以发现分桶字段一样的数据就一定被分到同一个桶中。

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19

Found

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19/us-covid19-counties.dat

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket

Found

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000000_0

-rw-r--r--

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000001_0

-rw-r--r--

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000002_0

-rw-r--r--

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000003_0

-rw-r--r--

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000004_0

简单查看一下文件情况

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000000_0

head

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_bucket/000001_0

head

根据join的字段对表进行分桶操作比如下图中id是join的字段

分桶表数据进行高效抽样

当数据量特别大时对全体数据进行处理存在困难时抽样就显得尤其重要了。

抽样可以从被抽取的数据中估计和推断出整体的特性是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法

7-4.Hive

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表尝试修改数据

如果不做任何配置修改直接针对Hive中已有的表进行Update、Delete、Insert操作可以发现只有insert语句可以执行Update和Delete操作会报错。

Insert插入操作能够成功的原因在于底层是直接把数据写在一个新的文件中的

create

12345678910111213141516171819202122

wangtingops01:/home/wangting/20221013

hdfs

/user/hive/warehouse/hv_2022_10_13.db/student执行数据修改操作

select

------------------------------------------------------------------------

student.num

------------------------------------------------------------------------

95001

------------------------------------------------------------------------

rows

(state42000,code10294)注意此时出现了报错

FAILED:

hive.exec.dynamic.partition.mode

nonstrict;

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

set

--在此metastore实例上运行多少个压缩程序工作线程。

0:

set

hive.exec.dynamic.partition.mode

nonstrict;

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

rows

TBLPROPERTIES(transactionaltrue);

--注意

事务表创建几个要素开启参数、分桶表、存储格式orc、表属性针对事务表进行增删改查操作验证

insert

------------------------------------------------------------

trans_student.id

------------------------------------------------------------

wangting

------------------------------------------------------------

row

------------------------------------------------------------

trans_student.id

------------------------------------------------------------

wangting

------------------------------------------------------------

row

------------------------------------------------------------

trans_student.id

------------------------------------------------------------

------------------------------------------------------------

rows

Hive中的视图view是一种虚拟表只保存定义不实际存储数据。

通常从真实的物理表查询中创建生成视图也可以从已经存在的视图上创建新视图。

创建视图时将冻结视图的架构如果删除或更改基础表则视图将失败。

视图是用来简化操作的不缓冲记录也没有提高查询性能。

相关语法示例

------------------------------------------

count_date

------------------------------------------

2021-01-28

------------------------------------------

rows

-----------------------------------------------------------------------------------------------

v_usa_covid19.county

-----------------------------------------------------------------------------------------------

2021-01-28

-----------------------------------------------------------------------------------------------

rows

---------------------------------------------------------------------------------------------------------------------------------------

v_usa_covid19_from_view.count_date

---------------------------------------------------------------------------------------------------------------------------------------

2021-01-28

---------------------------------------------------------------------------------------------------------------------------------------

rows

(state42000,code10090)--4、查看视图定义

show

----------------------------------------------------

createtab_stmt

----------------------------------------------------

CREATE

t_usa_covid19.county,t_usa_covid19.state,t_usa_covid19.deaths

from

----------------------------------------------------

row

----------------------------------------------

v_usa_covid19.county

----------------------------------------------

Autauga

----------------------------------------------

rows

将真实表中特定的列数据提供给用户保护数据隐式降低查询的复杂度优化查询语句

7-6.Hive3.0新特性物化视图

View是一个包括查询结果的数据库对像可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果。

在执行查询时就可以避免进行这些耗时的操作而从快速的得到结果使用物化视图的目的就是通过预计算提高查询性能当然需要占用一定的存储空间Hive3.0开始尝试引入物化视图并提供对于物化视图的查询自动重写机制基于Apache

Calcite实现Hive的物化视图还提供了物化视图存储选择机制可以本地存储在Hive也可以通过用户自定义storage

handlers存储在其他系统如DruidHive引入物化视图的目的就是为了优化数据查询访问的效率,相当于从数据预处理的角度优化数据访问Hive从3.0丢弃了index索引的语法支持推荐使用物化视图和列式存储文件格式来加快查询的速度

物化视图与视图区别

视图是虚拟的逻辑存在的只有定义没有存储数据物化视图是真实的物理存在的里面存储着预计算的数据视图的目的是简化降低查询的复杂度而物化视图的目的是提高查询性能

物化视图能够缓存数据在创建物化视图的时候就把数据缓存起来了Hive把物化视图当成一张“表”将数据缓存。

而视图只是创建一个虚表只有表结构没有数据实际查询的时候再去改写SQL去访问实际的数据表

物化视图语法

[db_name.]materialized_view_name[DISABLE

REWRITE][COMMENT

materialized_view_comment][PARTITIONED

(col_name,

...;物化视图创建后select查询执行数据自动落地“自动”也即在query的执行期间任何用户对该物化视图是不可见的,执行完毕之后物化视图可用

默认情况下创建好的物化视图可被用于查询优化器optimizer查询重写在物化视图创建期间可以通过DISABLE

REWRITE参数设置禁止使用

format为hive.materializedview.serde、

hive.materializedview.fileformat

CREATE

org.apache.hadoop.hive.druid.DruidStorageHandler

SELECT

[db_name.]materialized_view_name;

SHOW

[db_name.]materialized_view_name;

当数据源变更新数据插入inserted、数据修改modified物化视图也需要更新以保持数据一致性目前需要用户主动触发rebuild重构​sql

ALTER

[db_name.]materialized_view_name

物化视图创建后即可用于相关查询的加速即用户提交查询query若该query经过重写后可以命中已经存在的物化视图则直接通过物化视图查询数据返回结果以实现查询加速

hive.materializedview.rewritingtrue;

ALTER

[db_name.]materialized_view_name

ENABLE|DISABLE

用户提交查询query若该query经过重写后可以命中已经存在的物化视图则直接通过物化视图查询数据返回结果以实现查询加速

表student数据内容

------------------------------------------------------------------------

student.num

------------------------------------------------------------------------

95001

------------------------------------------------------------------------

rows

hive.exec.dynamic.partition.mode

nonstrict;

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

set

TBLPROPERTIES(transactionaltrue);

insert

----------------------------------------------------------------

student_trans.sno

----------------------------------------------------------------

95022

----------------------------------------------------------------

rows

由于会命中物化视图重写query查询物化视图查询速度会加快没有启动MR只是普通的table

scan

通过explain来查询SELECT执行情况可以看到查询走了alias:

hv_2022_10_13.student_trans_agg

explain

----------------------------------------------------

Explain

----------------------------------------------------

STAGE

hv_2022_10_13.student_trans_agg

Statistics:

----------------------------------------------------

rows

在Hive中DATABASE的概念和RDBMS中类似我们称之为数据库DATABASE和SCHEMA是可互换的都可以使用默认的数据库叫做default存储数据位置位于/user/hive/warehouse下用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下

create

COMMENT数据库的注释说明语句LOCATION指定数据库在HDFS存储位置默认/user/hive/warehouse/dbname.dbWITH

--创建数据库

1234如果需要使用location指定路径的时候最好指向的是一个新创建的空文件夹

describe

显示Hive中数据库的名称注释如果已设置及其在文件系统上的位置等信息EXTENDED关键字用于显示更多信息。

可以将关键字describe简写成desc使用

DESCRIBE

默认行为是RESTRICT这意味着仅在数据库为空时才删除它要删除带有表的数据库不为空的数据库我们可以使用CASCADE

DROP

Hive中针对表的DDL操作可以说是DDL中的核心操作包括建表、修改表、删除表、描述表元数据信息。

其中以建表语句为核心中的核心详见Hive

DDL建表语句。

可以说表的定义是否成功直接影响着数据能够成功映射进而影响是否可以顺利的使用Hive开展数据分析。

由于Hive建表之后加载映射数据很快实际中如果建表有问题可以不用修改直接删除重建。

describe

如果指定了EXTENDED关键字则它将以Thrift序列化形式显示表的所有元数据。

如果指定了FORMATTED关键字则它将以表格格式显示元数据

describe

如果已配置垃圾桶且未指定PURGE则该表对应的数据实际上将移动到HDFS垃圾桶而元数据完全丢失删除EXTERNAL表时该表中的数据不会从文件系统中删除只删除元数据如果指定了PURGE则表数据跳过HDFS垃圾桶直接被删除。

因此如果DROP失败则无法挽回该表数据

DROP

该操作仅更改表元数据。

现有数据的任何转换都必须在Hive之外进行。

ALTER

---------------------------------

col_name

---------------------------------

int

---------------------------------

rows

---------------------------------

col_name

---------------------------------

int

---------------------------------

rows

---------------------------------

col_name

---------------------------------

int

---------------------------------

rows

PARTITION会更改表元数据但不会加载数据。

如果分区位置中不存在数据查询时将不会返回结果。

因此需要保证增加的分区位置路径下数据已经存在或者增加完分区之后导入分区数据

增加一个分区

/user/hive/warehouse/database_name.db/table_name/provincexxx;

一次增加多个分区

Hive将每个表的分区列表信息存储在其metastore中。

但是如果将新分区直接添加到HDFS例如通过使用hadoop

-put命令或从HDFS中直接删除分区文件夹则除非用户ALTER

TABLE

PARTITION在每个新添加的分区上运行命令否则metastore也就是Hive将不会意识到分区信息的这些更改。

MSCK是metastore

--4、修复分区

PARTITIONS使用此选项它将把HDFS上存在但元存储中不存在的所有分区添加到metastore。

DROP

PARTITIONS选项将从已经从HDFS中删除的metastore中删除分区信息。

SYNC

PARTITIONS。

如果存在大量未跟踪的分区则可以批量运行MSCK

REPAIR

创建一张分区表直接使用HDFS命令在表文件夹下创建分区文件夹并上传数据此时在Hive中查询是无法显示表数据的因为metastore中没有记录使用MSCK

ADD

PARTITIONS进行修复。

针对分区表直接使用HDFS命令删除分区文件夹此时在Hive中查询显示分区还在因为metastore中还没有被删除使用MSCK

DROP

wangtingops01:/home/wangting/20221013

hero/

wangtingops01:/home/wangting/20221013/hero

archer.txt

wangtingops01:/home/wangting/20221013/hero

hadoop

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou

wangtingops01:/home/wangting/20221013/hero

hadoop

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke

wangtingops01:/home/wangting/20221013/hero

hadoop

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou

wangtingops01:/home/wangting/20221013/hero

hadoop

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke

12345678

wangtingops01:/home/wangting/20221013/hero

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/

Found

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke

wangtingops01:/home/wangting/20221013/hero

hadoop

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou

Deleted

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/rolesheshou

wangtingops01:/home/wangting/20221013/hero

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/

Found

/user/hive/warehouse/hv_2022_10_13.db/t_all_hero_part_msck/roletanke

123456789

查看表的分区记录已经删除hdfs的rolesheshou但依旧可以查到

show

schemas;--2、显示当前数据库所有表/视图/物化视图/分区/索引

show

database_name];--4、显示当前数据库下所有物化视图

SHOW

database_name];--5、显示表分区信息分区按字母顺序列出不是分区表执行该语句会报错

show

database_name.table_name;--7、显示表的属性信息

SHOW

([db_name.]table_name|view_name);

show

table_name;--10、显示当前支持的所有自定义和内置的函数

show

Load英文单词的含义为加载、装载所谓加载是指将数据文件移动到与Hive表对应的位置移动时是纯复制、移动操作。

纯复制、移动指在数据load加载到表中时Hive不会对表中的数据内容进行任何转换任何操作

load语法规则

filepath表示待移动数据的路径。

可以指向文件在这种情况下Hive将文件移动到表中也可以指向中的所有文件移动到表中filepath文件路径支持下面三种形式要结合LOCAL关键字一起考虑

相对路径例如project/data1绝对路径例如/user/hive/project/data1具有schema的完整URI例如hdfs://host_ip:9000/user/hive/project/data1

LOCAL

若指定相对路径将相对于用户的当前工作目录进行解释用户也可以为本地文件指定完整的URI-例如file:///user/hive/project/data1

没有指定LOCAL关键字

如果filepath指向的是一个完整的URI会直接使用这个URI如果没有指定schemaHive会使用在hadoop配置文件中参数fs.default.name指定的

LOCAL本地概念

则本地文件系统指的是Hiveserver2服务所在机器的本地Linux文件系统不是Hive客户端所在的本地文件系统

OVERWRITE

如果使用了OVERWRITE关键字则目标表或者分区中的已经存在的数据会被删除然后再将filepath指向的文件/目录中的内容添加到表/分区中

10-2.使用Load加载数据到表中案例

wangtingops01:/home/wangting/20221013

archer.txt

wangtingops01:/home/wangting/20221013

pwd

/home/wangting/20221013连接hive数据库操作并验证student_local表

beeline

/home/wangting/20221013/students.txt

INTO

]数据文件在服务器ops01上但是命令行连接hive的客户端是从另外一台服务器ops02上操作但是文件可以load所以load时beeline

wangting连接的是hive2协议机器为ops01那么INPATH路径则指的是ops01上的路径位置

student_HDFS表操作验证

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

wangtingops01:/home/wangting/20221013

hdfs

Hive3.0load加载数据时除了移动、复制操作之外在某些场合下还会将加载重写为INSERT

SELECTHive3.0还支持使用inputformat、SerDe指定输入格式例如TextORC等

如果表具有分区则load命令没有指定分区则将load转换为INSERT

本来加载的时候没有指定分区语句是报错的但是文件的格式符合表的结构前两个是col1,col2,最后一个是分区字段col3则此时会将load语句转换成为insert

select语句

wangtingops01:/home/wangting/20221013

echo

wangtingops01:/home/wangting/20221013

echo

wangtingops01:/home/wangting/20221013

echo

wangtingops01:/home/wangting/20221013

cat

wangtingops01:/home/wangting/20221013

pwd

/home/wangting/20221013/tab1.txt

INTO

------------------------------------------------

col_name

------------------------------------------------

col1

------------------------------------------------

rows

------------------------------------

tab1.col1

------------------------------------

------------------------------------

rows

在MySQL这样的RDBMS中通常使用insertvalues的方式来向表插入数据并且执行速度很快insertvalues是RDBMS中表插入数据的核心方式

INSERT

);假如把Hive当成RDBMS用insertvalues的方式插入数据会如何

如果在Hive中使用insertvalues对于大数据环境一条条插入数据用时相对RDBMS非常耗时

清洗数据成为结构化文件再使用Load语法加载数据到表中。

这样的效率更高

hive的insertselect表示将后面查询返回的结果作为内容插入到指定表中注意OVERWRITE将覆盖已有数据

需要保证查询结果列的数目和需要插入数据表格的列数目一致。

如果查询出来的数据类型和插入表格对应的列数据类型不一致将会进行转换但是不能保证转换一定成功转换失败的数据将会为NULL

--语法规则

------------------------------------------------------------------------

student.num

------------------------------------------------------------------------

95001

------------------------------------------------------------------------

rows

------------------------------------------------------

------------------------------------------------------

95001

------------------------------------------------------

rows

多重插入其核心功能是一次扫描多次插入语法目的就是减少扫描的次数在一次扫描中完成多次insert操作

from

old_table会扫描表之后insert执行均使用档次扫描结果

而如果使用以下传统方式则每次insert执行都将意味着扫描一次原表

insert

------------------------------------------------------------------------

student.num

------------------------------------------------------------------------

95001

------------------------------------------------------------------------

rows

-----------------------11-3.Dynamic

Partition

对于分区表的数据导入加载最基础的是通过load命令加载数据在load过程中分区值是手动指定写死的叫做静态分区

例如一张表对应的分区有几百个每个分区对应一个单独的映射文件那么使用load命令导入则会反复执行几百次

此时则需要有办法来处理这样的耗时操作那么需要引入一个动态分区插入的概念

动态分区插入概念

分区的值是由后续的select查询语句的结果来动态确定的根据查询结果自动分区

动态分区启动相关配置参数

hive.exec.dynamic.partition.mode

nonstrict;

在strict模式下用户必须至少指定一个静态分区以防用户意外覆盖所有分区在nonstrict模式下允许所有分区都是动态的

动态分区插入示例

原表student原表5个字段numnamesexagedept

select

------------------------------------------------------------------------

student.num

------------------------------------------------------------------------

95001

------------------------------------------------------------------------

row

创建一张新表student_partition,注意创建时是4个字段SnoSnameSexSage

create

hive.exec.dynamic.partition.modenonstrict

执行数据插入发现报错了报错内容意思为动态分区严格模式需要至少一个静态分区列。

要禁用此功能请设置hive.exec.dynamic.partition。

模式非严格nonstrict

set

hive.exec.dynamic.partition.mode

nonstrict;

-------------------------------------------------------

tb1.sno

-------------------------------------------------------

95001

-------------------------------------------------------

row

Hive支持将select查询的结果导出成文件存放在文件系统中

导出语法

写入文件系统的数据被序列化为文本列之间用\001隔开行之间用换行符隔开。

如果列都不是原始数据类型那么这些列将序列化为JSON格式。

也可以在导出的时候指定分隔符换行符和文件格式

--标准语法:

------------------------------------------------------------------------

student.num

------------------------------------------------------------------------

95001

------------------------------------------------------------------------

row

--2、导出查询结果到HDFS指定目录下,并且指定分隔符和文件存储格式

insert

--3、导出数据到本地文件系统指定目录下本地文件指连接的hive2服务所在的环境对应本地路径jdbc:hive2://ops01:10000则对应为ops01服务器对应的路径

insert

/tmp/hive_export/20221018/000000_0

hdfs

/tmp/hive_export/20221018/000000_0

2022-10-18

/tmp/hive_export/20221019/000000_0

hive提供了工具orcfiledump可以查看解析hdfs的orc文件hive

--orcfiledump

/tmp/hive_export/20221019/000000_0

Rows:

struct_col0:int,_col1:string,_col2:string,_col3:int,_col4:stringStripe

Statistics:

(OrcCodecPool.java:getCodec(56))

Got

/home/wangting/hive_export/000000_0

95005刘刚男18MA

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文件夹命名格式

delta_minWID_maxWID_stmtID即delta前缀、写事务的ID范围、以及语句ID删除时前缀是delete_delta里面包含了要删除的文件

Hive会为写事务INSERT、DELETE等创建一个写事务IDWrite

ID该ID在表范围内唯一

_orc_acid_version的内容是2,即当前ACID版本号是2。

和版本1的主要区别是UPDATE语句采用了split-update特性即先删除、后插入。

这个文件不是ORC文件可以下载下来直接查看bucket_00000文件则是写入的数据内容。

如果事务表没有分区和分桶就只有一个这样的文件。

文件都以ORC格式存储底层二级制

operation0

表示删除。

由于使用了split-updateUPDATE是不会出现的所以delta文件中的operation是0

delete_delta

originalTransaction、currentTransaction该条记录的原始写事务ID当前的写事务ID。

row具体数据。

对于DELETE语句则为null对于INSERT就是插入的数据对于UPDATE就是更新后的数据

合并器(Compactor):

随着表的修改操作创建了越来越多的delta增量文件就需要合并以保持足够的性能。

合并器Compactor是一套在Hive

Metastore内运行支持ACID系统的后台进程。

所有合并都是在后台完成的不会阻止数据的并发读、写。

合并后系统将等待所有旧文件的读操作完成后删除旧文件。

合并操作分为两种minor

compaction小合并、major

小合并会将一组delta增量文件重写为单个增量文件默认触发条件为10个delta文件大合并将一个或多个增量文件和基础文件重写为新的基础文件默认触发条件为delta文件相应于基础文件占比10%

12-3.Hive事务表使用设置与局限性

虽然Hive支持了具有ACID语义的事务但是在使用起来并没有像在MySQL中使用那样方便有很多限制

尚不支持BEGINCOMMIT和ROLLBACK所有语言操作都是自动提交的表文件存储格式仅支持ORCSTORED

ORC需要配置参数开启事务使用外部表无法创建为事务表因为Hive只能控制元数据无法管理数据表属性参数transactional必须设置为true必须将Hive事务管理器设置为org.apache.hadoop.hive.ql.lockmgr.DbTxnManager才能使用ACID表事务表不支持LOAD

DATA

hive.exec.dynamic.partition.mode

nonstrict;

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;服务端

set

--在此metastore实例上运行多少个压缩程序工作线程12-4.案例创建使用Hive事务表

use

hive.exec.dynamic.partition.mode

nonstrict;

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

rows

---------------------------------

emp.id

---------------------------------

Jerry

---------------------------------

rows

123456789101112131415161718192021222324252627282930

insert数据后查看映射文件目录为delta_0000001_0000001_0000

hdfs

/user/hive/warehouse/hv_2022_10_13.db/emp

Found

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000

1234

因为再次插入数据后会有新的事务产生所以查看hdfs上映射变化多了一个映射文件目录delta_0000002_0000002_0000

hdfs

/user/hive/warehouse/hv_2022_10_13.db/emp

Found

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000

hdfs

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000

Found

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000/_orc_acid_version

-rw-r--r--

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000/bucket_00000

hdfs

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000

Found

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000/_orc_acid_version

-rw-r--r--

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000/bucket_00000

12345678910111213

修改数据多了delta_0000003_0000003_0000和delete_delta_0000003_0000003_0000

hdfs

/user/hive/warehouse/hv_2022_10_13.db/emp/

Found

/user/hive/warehouse/hv_2022_10_13.db/emp/delete_delta_0000003_0000003_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000003_0000003_0000

1234567

删除数据多了delete_delta_0000004_0000004_0000

hdfs

/user/hive/warehouse/hv_2022_10_13.db/emp/

Found

/user/hive/warehouse/hv_2022_10_13.db/emp/delete_delta_0000003_0000003_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delete_delta_0000004_0000004_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000001_0000001_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000002_0000002_0000

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/emp/delta_0000003_0000003_0000

12345678第13章:Hive

Hive是基于Hadoop的数据仓库是面向分析支持分析工具。

将已有的结构化数据文件映射成为表然后提供SQL分析数据的能力因此在Hive中常见的操作就是分析查询select操作Hive早期是不支持update和delete语法的因为Hive所处理的数据都是已经存在的的数据、历史数据后续Hive支持了相关的update和delete操作不过有很多约束局限性

update操作

hive.exec.dynamic.partition.mode

nonstrict;

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

set

hive.exec.dynamic.partition.mode

nonstrict;

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

set

从哪里查询取决于FROM关键字后面的table_reference。

可以是普通物理表、视图、join结果或子查询结果表名和列名不区分大小写

语法数

链接https://pan.baidu.com/s/1cWq6wd0pfqaCRuBijt1WKg?pwdcc6v

提取码cc6v

现有美国2021-1-28号各个县county的新冠疫情累计案例信息包括确诊病例和死亡病例数据格式如下所示

字段含义count_date统计日期,county县,state州,fips县编码code,cases累计确诊病例,deaths累计死亡病例

下载解压文件包

wangtingops01:/home/wangting/20221013/usa

unzip

wangtingops01:/home/wangting/20221013/usa

total

COVID-19-Cases-USA-By-County.csv

-rw-rw-r--

COVID-19-Cases-USA-By-State.csv

-rw-rw-r--

COVID-19-Deaths-USA-By-County.csv

-rw-rw-r--

COVID-19-Deaths-USA-By-State.csv

-rw-rw-r--

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

12345678910创建实验表

,;--step2:将源数据load加载到t_usa_covid19表对应的路径下

load

/home/wangting/20221013/usa/us-covid19-counties.dat

into

------------------------------------------------------------------------------

tb1.count_date

------------------------------------------------------------------------------

2021-01-28

------------------------------------------------------------------------------

rows

--step2:使用动态分区插入将数据导入t_usa_covid19_p中

set

hive.exec.dynamic.partition.mode

nonstrict;

county,fips,cases,deaths,count_date,state

from

------------------------------------------------------------------------------

tb2.county

------------------------------------------------------------------------------

Autauga

------------------------------------------------------------------------------

rows

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19/

Found

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19/us-covid19-counties.dat

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/

Found

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28

wangtingops01:/home/wangting/20221013/usa

hdfs

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28

head

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateAlabama

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateAlaska

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateArizona

drwxr-xr-x

/user/hive/warehouse/hv_2022_10_13.db/t_usa_covid19_p/count_date2021-01-28/stateArkansas14-2.Hive

SQL

如果没有给出这些选项则默认值为ALL返回所有匹配的行DISTINCT指定从结果集中删除重复的行

select

在WHERE表达式中可以使用Hive支持的任何函数和运算符但聚合函数除外

聚合函数要使用它的前提是结果集已经确定。

而where子句还处于“确定”结果集的过程中因而不能使用聚合函数

select

------------------------------------------------------------------------------

t1.county

------------------------------------------------------------------------------

Los

------------------------------------------------------------------------------

rows

针对Hive分区表在查询时可以指定分区查询减少全表扫描也叫做分区裁剪所谓分区裁剪指对分区表进行查询时会检查WHERE子句或JOIN中的ON子句中是否存在对分区字段的过滤如果存在则仅访问查询符合条件的分区即裁剪掉没必要访问的分区

进行分区裁剪

---------------------------------------------------------------------------

t.county

---------------------------------------------------------------------------

Fresno

---------------------------------------------------------------------------

rows

---------------------------------------------------------------------------

t.county

---------------------------------------------------------------------------

Fresno

---------------------------------------------------------------------------

rows

分组字段出现select_expr中一定没有歧义因为就是基于该字段分组的同一组中必相同被聚合函数应用的字段也没歧义因为聚合函数的本质就是多进一出最终返回一个结果

select

在SQL中增加HAVING子句原因是WHERE关键字无法与聚合函数一起使用HAVING子句可以让我们筛选分组后的各组数据,并且可以在Having中使用聚合函数因为此时wheregroup

by已经执行结束结果集已经确定

having是在分组后对数据进行过滤where是在分组前对数据进行过滤having后面可以使用聚合函数where后面不可以使用聚合函数

LIMIT

LIMIT用于限制SELECT语句返回的行数LIMIT接受一个或两个数字参数这两个参数都必须是非负整数常量第一个参数指定要返回的第一行的偏移量第二个参数指定要返回的最大行数。

当给出单个参数时它代表最大行数并且偏移量默认为0

5条数据对应顺序为01234

------------------------------------------------------------------

t.count_date

------------------------------------------------------------------

2021-01-28

------------------------------------------------------------------

rows

2,2表示从顺序为2开始的数据取2条即为第3条和第4条从0开始

select

------------------------------------------------------------------

t.count_date

------------------------------------------------------------------

2021-01-28

------------------------------------------------------------------

rows

聚合语句(sum,min,max,avg,count)要比having子句优先执行where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)

14-3.Hive

当底层使用MapReduce引擎执行的时候只会有一个reducetask执行。

如果输出的行数太大会导致需要很长的时间才能完成全局排序

在Hive

----------------------------------------------------------------------

t.county

----------------------------------------------------------------------

Sierra

----------------------------------------------------------------------

rows

---------------------------------------------------------------------------

t.county

---------------------------------------------------------------------------

Los

---------------------------------------------------------------------------CLUSTER

根据指定字段将数据分组每组内再根据该字段正序排序只能正序根据同一个字段分且排序

分组规则hash散列分桶表规则一样Hash_Func(col_name)

reducetask个数分为几组取决于reducetask的个数

CLUSTER

BY更不能在这里使用因为是全局排序只有一个输出无法满足分的需求

DISTRIBUTE

by全局排序因此只有一个reducer结果输出在一个文件中当输入规模大时需要较长的计算时间distribute

by既有分组又有排序但是两个字段只能是同一个字段如果distribute和sort的字段是同一个时此时cluster

distribute

UNION用于将来自于多个SELECT语句的结果合并为一个结果集

使用DISTINCT关键字与只使用UNION默认值效果一样都会删除重复行。

1.2.0之前的Hive版本仅支持UNION

ALL在这种情况下不会消除重复的行使用ALL关键字不会删除重复行结果集包括所有SELECT语句的匹配行包括重复行每个select_statement返回的列的数量和名称必须相同

[ALL

--使用DISTINCT关键字与使用UNION默认值效果一样都会删除重复行。

select

Hive支持任意级别的子查询也就是所谓的嵌套子查询子查询名称之前可以包含可选关键字AS

子查询

不相关子查询该子查询不引用父查询中的列可以将查询结果视为IN和NOT

执行子查询其结果不被显示而是传递给外部查询作为外层查询的条件使用

SELECT

公用表表达式CTE是一个临时结果集该结果集是从WITH子句中指定的简单查询派生而来的紧接在SELECT或INSERT关键字之前CTE仅在单个语句的执行范围内定义CTE可以在

SELECTINSERT

----------------------------------------------------

_u1.num

----------------------------------------------------

95002

----------------------------------------------------

rows

-----------------------------------------------

s1.num

-----------------------------------------------

95002

-----------------------------------------------

row

-----------------------------------------------

v1.num

-----------------------------------------------

95002

-----------------------------------------------

row



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback