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

Posted

技术标签:

【中文标题】Hive - 是不是必须将“=”外部表视为分区【英文标题】:Hive - Is it mandatory to have '=' for external table to consider as partitionHive - 是否必须将“=”外部表视为分区 【发布时间】:2020-07-08 03:19:36 【问题描述】:

我是 Hive 新手,有以下基本问题:

我正在尝试在位置的 HDFS 目录上创建外部表

    /projects/score/output/scores_2020-06-30.gzip

但它不将其视为分区。

开发人员是否需要更改目录名称“scores=yyyy-mm-dd”代替“scores_yyyy-mm-dd.gzip” 像“/projects/score/output/scores=2020-06-30” 那么只有它会被认为是分区的?

即外部表是否必须有'='才能视为分区

或者我可以在创建时更改下表中的内容。尝试如下:

CREATE EXTERNAL TABLE IF NOT EXISTS XYZ (
...
)
PARTITIONED BY (scores STRING)
LOCATION '/projects/score/output/';

提前致谢!

【问题讨论】:

【参考方案1】:

您可以在任何位置的顶部定义分区,甚至使用ALTER TABLE ADD PARTITION 在表目录之外定义分区。 HDFS 中的分区是通常在表位置内的目录,但不一定。如果在表目录内,则可以使用msck repair table将表目录内现有的子目录附加为分区,它会扫描表位置并添加分区元数据。

在您的示例分区目录中丢失,您只有表目录,里面有一个文件。在这种情况下,文件名无关紧要。

分区目录并非绝对强制必须采用 key=value 格式,尽管 msck repair table 可能无法在您的 Hive 发行版中工作,但您仍然可以使用 ALTER TABLE ADD PARTITION ... LOCATION 命令在任何目录之上添加分区。

这可能取决于供应商。例如,在 Qubole 上,ALTER TABLE RECOVER PARTITIONS(EMR 替代 MSCK REPAIR TABLE)适用于像“2020-06-30”这样的目录。

默认情况下,使用动态分区插入数据时,它会以 key=value 格式创建分区文件夹,但如果您使用其他工具创建分区目录,则可以使用“value”作为分区文件夹名称。只需检查 MSCK REPAIR 是否适用于您的情况。如果没有,如果您需要 MSCK REPAIR,请创建目录 key=value。

在这种情况下,文件名和分区文件夹中的文件数无关紧要。

【讨论】:

所以你的意思是说首先我可以创建没有分区的表,然后我可以更改表,如 ALTER TABLE ADD XYZ PARTITION ('scores_2020-06-30.gzip') LOCATION "/projects/score /输出/”;我非常怀疑它会起作用。但会检查和更新。 @ShaanGreat 当您在某个目录之上创建分区表时,不会自动创建分区。您需要ALTER TABLE ADD PARTITION ... LOCATION ...MSCK REPAIR TABLE,msck repair 将查找表位置内的所有目录并为这些目录创建分区

以上是关于Hive - 是不是必须将“=”外部表视为分区的主要内容,如果未能解决你的问题,请参考以下文章

从 hdfs 中删除文件是不是会删除相应的 hive 外部表分区?

hive外部表分区

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

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

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

Hive中内部表外部表分区表分桶表之间的关系