首页 > 解决方案 > Hive 分区列

问题描述

我们在 hive 中有 avro 分区表。当我们查询表时,分区列显示在最后。有什么方法可以首先显示分区列吗?

例如:select * from tablea

输出:

Col1 col2 partition_column

预期输出:

分区列 col1 col2

标签: hivehiveqlpartitionhive-partitions

解决方案


分区列不存储在文件中,因此,avro 与否,在此上下文中无关紧要。分区列对应表文件夹中的分区子文件夹,并存储在元数据中。

从历史上看,分区列是最后一个。使用Insert覆盖表分区 (partition_column) SELECT * from ...` 的动态分区是相当常见的场景。Hive 会知道分区是最后一列。

动态分区列必须在 SELECT 语句中的列中最后指定,并且与它们在 PARTITION() 子句中出现的顺序相同。

您可以更改运行时显示的列的顺序,SELECT *仅通过创建一个view以所需顺序列出所有列的方法,或者在您的选择中明确选择列。

同样根据 Codd 的理论,列和行顺序无关紧要,您必须始终使用 ORDER BY 在选择和行顺序中明确指定所需的列顺序,而不是依赖表或视图中的列顺序和行顺序。但在 Hive 中,分区列是表中的最后一个。

还要考虑一下:您甚至可能不知道您从什么中选择:表格或视图。并且您可能不会收到上游系统最终决定更改表或视图的通知。视图或表格可以更改列的顺序。在进行选择时考虑将视图与表格相同。它只是抽象级别。使用显式列列表使您的程序始终可靠地工作,并且对基础表/视图中的列顺序没有很强的依赖关系,这是无关紧要的。


推荐阅读