我有多个蜂巢仓库。数据驻留在 Amazon S3 中的 parquet 文件中。有些表包含 TB 的数据。目前,在 hive 中,大多数表都是按月份和年份的组合进行分区的,两者主要保存为字符串。其他字段是 bigint、int、float、double、string 和 unix 时间戳。我们的目标是将它们迁移到 apache 冰山表。挑战在于如何选择分区键。
我已经通过以下方式计算了每个表中每个字段的基数:
Select COUNT(DISTINCT my_column) As my_column_count
From my_table;
我还计算了每个字段的空值百分比:
SELECT 100.0 * count(*)/number_of_all_records
FROM my_db.my_table
Where my_column IS NULL;
简而言之,我已经知道每个领域的三件事:
通过了解这三个信息,我的问题是我应该如何选择最佳的列或列组合作为我未来冰山表的分区键?有什么经验法则吗?
选择分区键时有多少个分区被认为是优化的?选择分区键时哪种数据类型最好?还有哪些其他因素需要考虑?冰山表中的分桶与 Hive 中的分桶相同吗?分区键如何利用它?哪些数据类型最适合分区键?是有很多小分区好还是有几个大分区好?分区键中还需要考虑其他方面吗?
您的描述中缺少一个关键部分 - 查询。您需要了解将对这些数据运行哪些查询。了解将对数据运行的查询(尽你所能)非常重要。 例如,考虑一个简单的表,其中包含:日期、ID、名称、年龄作为列。 如果查询是基于日期的含义,它将在日期上下文中查询数据,
select * from table where date > 'some-date'
那么按日期分区是个好主意。
但是,如果查询与年龄相关
select * from table where age between 20 and 30
那么你应该考虑按年龄或年龄段划分