hive外部表分区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive外部表分区相关的知识,希望对你有一定的参考价值。

参考技术A 内部表:
数据由hive自身管理 存储在hive指定的hdfs目录中 删除会删除数据本身
外部表(external):
数据存储在用户使用location关键字指定的hdfs目录中 hive中仅存储一份元数据 删除操作不会影响到hdfs中原本的数据文件

将hdfs中文件存储在不同的目录下 hive查询时仅查询指定目录下的数据 避免扫描全部文件 可以极大的加速查询 hive支持静态分区和动态分区
静态分区由用户指定分区所在的目录 而动态分区由表中的某一个字段来决定每条数据所在的分区

创建了一个bill表其中包含三个业务字段
partitioned by (day int) 指定了day为分区标志 在查询时使用 where day = 20201010 来指定分区

为bill表添加一个分区目录20201010 当指定day = 20201010时 将在这个分区查询数据
随日期增加 需要手动将对应日期的目录作为分区添加到bill中 可以使用crontab 每天自动执行一次添加分区的操作

使用路径中没有列名的分区创建 Hive 外部表?

【中文标题】使用路径中没有列名的分区创建 Hive 外部表?【英文标题】:Create Hive external table with partition WITHOUT column name in the path? 【发布时间】:2016-10-28 07:29:20 【问题描述】:

我需要为只读存在的文件夹结构创建一个外部表。

原来的 hive 表有年、月、日等分区。他们的文件以这种方式存储在路径中HDFS_PATH/2016/10/04/

但是当我在 hive 中创建一个外部表时,它总是存储到像HDFS_PATH/year=2016/month=10/day=04/ 这样的路径

虽然我可以更改 1 个分区位置,例如此链接 How to Update/Drop a Hive Partition? ,但我必须为每个分区组合设置位置。

有没有更简单的方法一劳永逸地设置它?

【问题讨论】:

只是要明确一点:您是否正在寻找一种方法来创建一个具有特定文件夹结构的特定表的年/月/日?或者您是否需要一个通用的解决方案,该解决方案也适用于 Quarter 或 PostalCode 等分区? 只创建一张表,但它有很多分区 【参考方案1】:

认为最好回答您的问题,因为其他答案没有解释。

使用动态分区(不列出每个分区并单独添加)的唯一方法是使用您在格式中提到的“Hive 样式”分区:HDFS_PATH/year=2016/month=10/day=04/

虽然 HCatalog 支持自定义路径,但 Hive 本身不支持,并且有一个 -open ticket tracking this feature here.

在解决此票证之前,您必须使用您提到的“Hive 样式”格式(并在此票证中提到)或使用ALTER TABLE 命令自己手动添加所有分区。解决此票证后,MSCK REPAIR TABLE 就可以按照您的意愿工作。

【讨论】:

【参考方案2】:

您可以通过设置:set hive.exec.dynamic.partition=true; 动态地执行此操作,或者您可以只执行 msck repair table table_name 来对您的数据进行分区。

【讨论】:

它不能解决我的要求without column name in path 我明白了,那么我认为您必须设置所有分区组合,但是您可以编写一个脚本来增加天湾天添加分区。这样,您可以自动添加或删除分区。【参考方案3】:

有点晚了:

 alter table my_table add partition (year='2017',month='07',day='10', hour='10') location '2017/07/10/10';

【讨论】:

感谢您的回复,但是我必须枚举所有分区的所有组合,这是我试图避免的。

以上是关于hive外部表分区的主要内容,如果未能解决你的问题,请参考以下文章

Hive内部表、外部表、分区表、桶表概述

Hive管理表,外部表及外部分区表的深入探讨

Hive - 是不是必须将“=”外部表视为分区

hive 四种表,分区表,内部,外部表,桶表

Hive表操作二(管理表外部表分区表)

删除 hive 分区外部表但保留分区