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

Posted

技术标签:

【中文标题】使用路径中没有列名的分区创建 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中创建外部分区表使用location是指定数据存放位置还是指数据来源

在 hive 的外部表中创建分区

Hive常用命令

如何使用 spark 获取 hive 分区列名