Hive 如何避免显式设置配置单元分区的HDFS位置?

Hive 如何避免显式设置配置单元分区的HDFS位置?,hive,Hive,我们有一个配置单元表,它在几个键上进行分区。让我们把这些键称为国家、州、城市来举例说明。我们使用以下命令将新分区添加到此表: ALTER TABLE tbl ADD PARTITION("us", "wa", "seattle") LOCATION "hdfs://root_path/us/wa/city=seattle" 这对我们来说变得不可扩展,因为对于国家、州、城市的每一个组合,我们都在发布高于命令的命令。例如,假设每个键可以接受100个不同的值,因此我们总共有100*100*100=1

我们有一个配置单元表,它在几个键上进行分区。让我们把这些键称为国家、州、城市来举例说明。我们使用以下命令将新分区添加到此表:

ALTER TABLE tbl ADD PARTITION("us", "wa", "seattle") LOCATION "hdfs://root_path/us/wa/city=seattle"
这对我们来说变得不可扩展,因为对于国家、州、城市的每一个组合,我们都在发布高于命令的命令。例如,假设每个键可以接受100个不同的值,因此我们总共有100*100*100=1e6组合,并且必须发出如上所述的1e6 SQL命令


在创建表的过程中,是否有一种方法可以告诉配置单元in1sql命令,请查看目录hdfs://root_path/{country}/{state}/city={city}获取与国家、州、市对应的数据。例如,要获取加拿大、不列颠哥伦比亚省、温哥华的数据,只需查看hdfs://root_path/canada/bc/city=vancouver

检查配置单元动态分区

在动态分区插入中,用户可以给出部分分区 规范,这意味着只需指定分区列表 PARTITION子句中的列名

如果您有一个基于文件的表。这会奏效的

INSERT OVERWRITE TABLE tbl PARTITION (country, state, city)
SELECT
  other1, other2, ...     -- set another columns first
  country, state, city    -- columns for partition are last
FROM source_table WHERE ...

我们没有基于文件的表。国家、州、城市的数据存储在hdfs://root_path/{country}/{state}/city={city}在拼花地板文件中,此文件中的数据没有国家、州和城市列。您可以显式设置每个分区的位置,而不依赖默认的命名约定。但这仍然意味着1e6 ALTER TABLE命令;他们形成了一个等级制度。您是否考虑创建一个单一级别的分区,其聚合列类似于Ca:BC:温哥华,并将每个单独的列存储在实木拼花地板中?或者像ca:bc这样的单一级别,同时确保每个文件只包含一个城市,以便拼花地板页脚统计允许立即进行文件级修剪?或者反过来说,一个级别的分区,但对于城市,因为没有太多的碰撞?