Hive 中分区列的顺序是否重要?
Does order of partitioning columns matter in Hive?
假设我有一个分区 table,其中有多个列作为分区键,例如
partitioned by (department string,year int, month int,day int)
那么这个特定的顺序真的很重要吗?所有在线资源都指的是只扫描特定子目录进行搜索的优势。但最终一切都是大数据中的文件,目录似乎更像是逻辑分组。当一个人在分区列上指定一个过滤器时,配置单元只需要知道涉及哪些文件以及它们位于何处,不确定目录将如何有用——这不像目录被加载到内存中——文件是加载到内存中——目录路径更像是给定文件的标签。如果是这样的话,无论我们为 partitioning 指定哪种顺序,都应该无关紧要。这在底层文件系统 (BLOB) 没有目录概念的 HDInsight 中尤为明显。
虽然您认为目录是逻辑结构是正确的,但如果您考虑到 HiveServer2 必须获取和筛选元数据的数量才能执行平均查询,那么顺序确实很重要。如果查询包含 ...WHERE department='IT'...
,并且分区如您所示布局,给定总共 100 个部门,分区修剪机制将能够立即从树中删除 99 个子目录。但是如果分区列的顺序颠倒,同样的查询将需要从 Hive MetaStore 中检索(30 天 x 12 个月 x N 年)个分区的元数据,只是为了弄清楚分区 /department=IT
是否实际存在于所有他们。所以分区的顺序可以通过分析主要的查询模式来决定。
另一个需要考虑的常见因素是 devops/maintenance 相关,尤其是当数据以增量方式加载到 table 中时。如果需要backoff/recover从不成功的加载中,他是否需要在每个部门子树中单独删除一个分区(day=08
),或者是否可以通过删除分区(day=08
)?
假设我有一个分区 table,其中有多个列作为分区键,例如
partitioned by (department string,year int, month int,day int)
那么这个特定的顺序真的很重要吗?所有在线资源都指的是只扫描特定子目录进行搜索的优势。但最终一切都是大数据中的文件,目录似乎更像是逻辑分组。当一个人在分区列上指定一个过滤器时,配置单元只需要知道涉及哪些文件以及它们位于何处,不确定目录将如何有用——这不像目录被加载到内存中——文件是加载到内存中——目录路径更像是给定文件的标签。如果是这样的话,无论我们为 partitioning 指定哪种顺序,都应该无关紧要。这在底层文件系统 (BLOB) 没有目录概念的 HDInsight 中尤为明显。
虽然您认为目录是逻辑结构是正确的,但如果您考虑到 HiveServer2 必须获取和筛选元数据的数量才能执行平均查询,那么顺序确实很重要。如果查询包含 ...WHERE department='IT'...
,并且分区如您所示布局,给定总共 100 个部门,分区修剪机制将能够立即从树中删除 99 个子目录。但是如果分区列的顺序颠倒,同样的查询将需要从 Hive MetaStore 中检索(30 天 x 12 个月 x N 年)个分区的元数据,只是为了弄清楚分区 /department=IT
是否实际存在于所有他们。所以分区的顺序可以通过分析主要的查询模式来决定。
另一个需要考虑的常见因素是 devops/maintenance 相关,尤其是当数据以增量方式加载到 table 中时。如果需要backoff/recover从不成功的加载中,他是否需要在每个部门子树中单独删除一个分区(day=08
),或者是否可以通过删除分区(day=08
)?