百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

详解基于Hadoop的数据仓库工具Hive(附超实用示例)

wxin55 2024-11-06 12:45 12 浏览 0 评论

Hive功能

Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据:可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容,这套SQL简称Hive SQL,使不熟悉mapreduce的用户可以很方便地利用SQL语言查询、汇总和分析数据。而mapreduce开发人员可以把自己写的mapper和reducer作为插件来支持Hive做更复杂的数据分析。它与关系型数据库的SQL略有不同,但支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。它还提供了一系列的1:具进行数据提取转化加载,用来存储、查询和分析存储在Hadoop中的大规模数据集,并支持UDF(User-Defined Function)、UDAF(User-Defnes AggregateFunction)和UDTF(User-Defined Table-Generating Function),也可以实现对map和reduce函数的定制,为数据操作提供了良好的伸缩性和可扩展性。

Hive不适合用于联机(online)上事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive的特点包括:可伸缩(在Hadoop的集群上动态添加设备)、可扩展、容错、输入格式的松散耦合。

内部表

Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。删除表时,元数据与数据都会被删除。

内部表示例:

创建数据文件:test_inner_table.txt

创建表:create table test_inner_table (key string)

加载数据:LOAD DATA LOCAL INPATH ‘filepath’ INTO TABLE test_inner_table

查看数据:select * from test_inner_table; select count(*) from test_inner_table

删除表:drop table test_inner_table

外部表

外部表指向已经在HDFS中存在的数据,可以创建Partition。外部表加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。

外部表示例:

创建数据文件:test_external_table.txt

创建表:create external table test_external_table (key string)

加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table

查看数据:select * from test_external_table; ?select count(*) from test_external_table

删除表:drop table test_external_table

分区

Partition对应于数据库中的Partition列的密集索引。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。

分区表示例:

创建数据文件:test_partition_table.txt

创建表:create table test_partition_table (key string) partitioned by (dt string)

加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_partition_table partition (dt=‘2006’)

查看数据:select * from test_partition_table; select count(*) from test_partition_table

删除表:drop table test_partition_table

Buckets是将表的指定列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。当需要并行执行Map任务时,桶是不错的选择。

桶的示例:

创建数据文件:test_bucket_table.txt

创建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets

加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_bucket_table

查看数据:select * from test_bucket_table; set hive.enforce.bucketing = true;

视图

视图与传统数据库的视图类似。视图是只读的,它基于的基本表,如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。如果不指定视图的列,会根据select语句后的生成。

示例:create view test_view as select * from test

倾斜表

对大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜。

数据倾斜,是并行处理的数据集中,某一部分的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集的瓶颈。

在Spark中,同一个Stage的不同Partition可以并行处理,而具有依赖关系的不同Stage之间是串行处理的。换句话说,一个Stage所耗费的时间,主要由最慢的那个Task决定。由于同一个Stage内的所有Task执行相同的计算,在排除不同计算节点计算能力差异的前提下,不同Task之间耗时的差异主要由该Task所处理的数据量决定。

倾斜表是一种特殊类型的表,其中经常出现的值(重偏差)被分割成单独的文件,其余的值将转到其他文件。通过指定偏斜值,Hive会自动将它们分解为单独的文件,并在查询期间可以跳过(或包含)整个文件,从而提高性能。

创建表语法:create table <T> (schema) skewed by (keys) on (values) [STORED as DIRECTORIES];

具体例子: create table T (c1 string, c2 string) skewed by (c1) on ('x1')

存储过程

存储过程是在数据库系统中为了完成特定功能的SQL 语句集,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

CREATE PROCEDURE proc_test

BEGIN

Drop table order_base.O_ORDER_DETAIL;

create table order_base.O_ORDER_DETAIL (customernumber string, invoicenumber string, invoicedate string, ordernumber string, itemnumberid string, ordertypeen string, ordertypesc string, salesrepid string, warehouse string, lineamount string, linecostamount string, invoicequantity string, lineno string) clustered by (ordertypeen) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true');

TRUNCATE TABLE order_base.O_ORDER_DETAIL;

INSERT INTO order_base.O_ORDER_DETAIL select * from ORDER_DETAIL;

update order_base.O_ORDER_DETAIL set itemnumberid=replace(itemnumberid,'*','');

END;

CALL proc_test

执行存储过程

hplsql -f /home/hadoop/proc_test.sql

查询结果

select * from order_base.O_ORDER_DETAIL where ordernumber=8800840;

客户端接口

CLI:command line interface,命令行接口。

Thrift客户端: Hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口。

WEBGUI:Hive客户端提供了一种通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI组件(Hive Web Interface),生产环境可用Hue组件代替,下图为Hue界面。


关于慧都数仓建模大师

慧都数仓建模大师能够快速、高效地帮助客户搭建数据仓库供企业决策分析之用。满足数据需求效率、数据质量、扩展性、面向主题等特点。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: