【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

简易指南:通过 Hive 分区删除管理优化数据存储 (简单指南)

用户投稿2024-04-15热门资讯26

引言

Apache Hive 是一个数据仓库系统,可针对存储在分布式文件系统(如 HDFS)中的大型数据集进行数据摘要、查询和分析。Hive 表可以根据特定列分区,以优化数据存储和查询性能。分区删除管理是一种 Hive 特性,可让您通过删除不再需要的数据来优化数据存储空间。本文将提供一个简易指南,向您展示如何使用 Hive 分区删除管理优化数据存储。

Hive 分区删除管理

要使用 Hive 分区删除管理,需要遵循以下步骤:

1. 创建分区表

需要使用以下语法创建分区表:CREATE TABLE table_name (column_name1 data_type1, column_name2 data_type2, ...) PARTITIONED BY (partition_column_name data_type)例如,创建一个名为 `sales` 的分区表,按 `date` 列分区:CREATE TABLE sales (product_id INT, sales_amount DECIMAL, sales_date DATE) PARTITIONED BY (sales_date)

2. 向表中加载数据

接下来,向分区表中加载数据。Hive 会自动将数据分配到适当的分区中。INSERT INTO table_name VALUES (value1, value2, ...)

3. 删除分区

当不再需要特定分区中的数据时,可以使用以下语法删除该分区:ALTER TABLE table_name DROP PARTITION (partition_condition)例如,删除 `sales` 表中的 `2023-01-01` 分区:ALTER TABLE sales DROP PARTITION (sales_date = '2023-01-01')

4. 清除分区

分区删除后,Hive 不会立即从存储中删除数据。您可以使用以下语法清除分区,从存储中实际删除数据:ALTER TABLE table_name PURGE PARTITION (partition_condition)例如,清除 `sales` 表中的 `2023-01-01` 分区:ALTER TABLE sales PURGE PARTITION (sales_date = '2023-01-01')

最佳实践

使用 Hive 分区删除管理优化数据存储时,请遵循以下最佳实践:确定要删除的分区:确定哪些分区不再需要,并且可以安全地删除。备份数据:在删除分区之前,请备份数据,以防以后需要。使用定期任务:安排定期任务自动删除不再需要的分区。监控存储使用情况:监控存储使用情况,以确保分区删除管理有效地优化了存储空间。

优点

使用 Hive 分区删除管理优化数据存储具有以下优点:优化存储空间:通过删除不再需要的数据,可以释放存储空间,从而降低存储成本。提高查询性能:通过减少分区中的数据量,可以提高数据查询的性能。简化数据管理:分区删除管理提供了管理数据生命周期并删除不再需要的数据的简单方法。 简易指南:通过 Hive 分区删除管理优化数据存储 (简单指南) 第1张

结语

Hive 分区删除管理是一种强大的功能,可让您通过删除不再需要的数据来优化数据存储。通过遵循本文中的步骤和最佳实践,您可以有效地利用分区删除管理,优化存储空间,提高查询性能并简化数据管理。

在hive中怎样删除一张有数据的管理表,包括删除数据

Hive的数据管理:

(1)元数据存储

Hive 将元数据存储在 RDBMS 中,有三种模式可以连接到数据库:

Single User Mode:此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test。

Multi User Mode:通过网络连接到一个数据库中,这是最常用的模式。

Remote Server Mode:用于非 Java 客户端访问元数据库,在服务器端启动一个 MetaStoreServer,客户端则利用 Thrift 协议通过 MetaStoreServer来访问元数据库。

(2)数据存储

首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由地组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,它就可以解析数据了。

其次,Hive 中所有的数据都存储在 HDFS 中,Hive 中包含4种数据模型:Table、External Table、Partition、Bucket。

Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录来存储数据。例如,一个表 pvs,它在 HDFS 中的路径为:/wh/pvs,其中,wh 是在 中由 ${} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。

Partition 对应于数据库中Partition 列的密集索引,但是 Hive 中 Partition 的组织方式与数据库中的很不相同。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 数据都存储在对应的目录中。例如:pvs 表中包含 ds 和 city 两个 Partition,则对应于 ds = , city = US 的 HDFS 子目录为:/wh/pvs/ds=/city=US;对应于 ds = , city = CA 的 HDFS 子目录为:/wh/pvs/ds=/city=CA。

Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了便于并行,每一个 Buckets对应一个文件。将 user 列分散至 32 个Bucket上,首先对 user 列的值计算 hash,比如,对应 hash 值为 0 的 HDFS 目录为:/wh/pvs/ds=/city=US/part-;对应hash 值为 20 的 HDFS 目录为:/wh/pvs/ds=/city=US/part-。

External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。它和 Table 在元数据的组织结构上是相同的,而在实际数据的存储上则有较大的差异。

在Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成)中,实际数据会被移动到数据仓库目录中。之后对数据的访问将会直接在数据仓库的目录中完成。删除表时,表中的数据和元数据将会被同时删除。

External Table 只有一个过程,因为加载数据和创建表是同时完成的。实际数据是存储在 Location 后面指定的 HDFS 路径中的,它并不会移动到数据仓库目录中。

(3)数据交换

数据交换主要分为以下几个部分

hive中怎么删除表中的部分数据

工具:(1)HIVE;

(2)电脑;

(3)Xshell;

采用hdfs命令进行删除表中的部分数据:

1、先使用hdfs查看该表实际分区以及数据目录位置

hdfs dfs -ls /user/hive/warehouse//表名小写/;

2、例如:使用hdfs命令删除该分区目录

hdfs dfs -rm -r -f/user/hive/warehouse//表名小写/etl_dt=;

3、最后查看是否有分区目录;

4、最查看进hive命令行查看此表是否还有数据。

hive 分区表

hive 分区表: 分区字段的物理表现:hive分区表 ,其真实的表现其实就是在 存储hive表的文件夹的下面,创建新的文件夹, 文件夹的名字是 分区字段=字段取值 这种格式的。 分区的优点: 当分区表的数据很大的时候,可以指定查询表格之中的部分数据。 设置表格分区字段需要的注意点: 1:分区字段的取值不要很多,因为这样会造成表的文件夹的下面会出现很多的小的文件夹 2: 一般可以将sql之中 where 之中出现的字段作为 分区的字段。 (可以当作分区字段选取的一个参考)查看表格是否是分区表: desc formatted table_name分区表的话 ,会有Partition Information向分区表插入数据: 情况分为: 1:向表格之中插入数据,明确指定插入的分区的名字 2:向表格之中插入数据,不明确指定插入的数据的名字,而是根据插入的数据的某个字段的取值来自动决定数据 被插入到哪一个分区之中。 被称为动态分区。 如何开启hive 动态分区的功能? set =true;hive 动态分区:有两种模式: 严格模式 和非严格模式 严格模式: 动态分区的时候,必须有一个分区是静态的。 非严格模式,对分区是否是静态的不在意。 如何设置 动态分区的模式? set =nostrict 默认的模式是strict 严格模式。 插入数据时 明确指定需要插入的分区的值: sql demo : 1:load,city) 这里需要注意的是顺序,静态分区在前面,动态分区在后面。 然后就是多个分区,完全的动态分区: 完全动态分区的时候,就是使用后面select 查询的表进行分区数据的匹配。 、动态分区在实际使用的时候会遇到的问题: 动态分区的一个使用场景: 首先加载数据到一个表格a之中,然后将这个表格之中再次转化到另外一个 表格b之中,表a转化到表b的时候,使用动态分区。 因为直接使用load 加载数据的时候,对于分区表而言,加载数据只能指定固定的分区名, 无法使用动态分区来加载数据。 相应的问题就是: 如果a表本身含有很多的文件,那么使用动态分区的时候, 那么在b表的时候,就是会产生很多的小文件。 原因如下: 如果 a表之中数据文件是200个, 那么动态分区的时候,可能会产生200个map, 然后一个map包含的数据之中,可能有多个分区的取值, 所以一个map 会产生多个文件。 所以后果就是,在新的b表之中的每个分区下面,会产生很多的小文件。 总结来说:不好的影响就是可能会产生很多的小文件。 解决的方式: 因为动态分区转化成为的mapredue job 是没有reduce,所以数目不好控制, 所以可以采用的方式,就是手动增加reduce的数目, 可以使用distributed by 来增加 reduce的数目。 insert into table table_a partition(partition_name) select * from table_b dirtribute by partitoin_name 但是这样的方式,就是可能导致 reduce之间包含的数据量的不均匀。 所以解决的方法就是: distribute by rand() 使用hash 随机分区,这样的方式,来讲数据均匀分配到reduce之中。 然后每个reduce 会产生 分区取值数目的文件, 例子: reduce数目为 200 分区的取值数位24 那么最后产生的文件的数目就是 200* 24个文件。 其实可以通过exlpain 来解析sql的执行计划,这样的话, 可以看出是否具有reduce操作。 查询表的分区信息: show partitions table_name向分区表之中增加分区: alter table table_name add partition(pfield=pvalue,...) 如果表格之中有多个分区的话,那么增加分区的时候,也是多个分区 一同增加的。 删除分区: alter table table_name drop partition(pfield=pval)分区信息修改: 分区信息的修改分为分区名的修改 和 分区数据的修改 两种分区名的修改 alter table table_name partition(pfield=pvalue) rename to partition(pfield=pvalue)分区数据的修改: alter table table_name partition(pfield=pvalue) set location data_location

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

简易指南:通过 Hive 分区删除管理优化数据存储 (简单指南) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!