使用字符串分区键与整数分区键的 Hive/Impala 性能

Posted

技术标签:

【中文标题】使用字符串分区键与整数分区键的 Hive/Impala 性能【英文标题】:Hive/Impala performance with string partition key vs Integer partition key 【发布时间】:2018-08-29 16:24:41 【问题描述】:

是否建议将数字列用于分区键?当我们对数字列分区和字符串列分区进行选择查询时,会不会有任何性能差异?

【问题讨论】:

【参考方案1】:

好吧,如果您查看 Impala 官方文档会有所不同。

我将粘贴文档中的部分,而不是详细说明,因为我认为它说明得很好:

“尽管使用 STRING 列作为分区键可能很方便,即使这些列包含数字,但为了性能和可伸缩性,只要可行,最好使用数字列作为分区键。虽然底层 HDFS 目录名称可能是无论哪种情况,如果将 YEAR、MONTH、DAY 等分区键列声明为 INT、SMALLINT 等,则分区键列的内存存储更紧凑,计算速度更快。 "

参考:https://www.cloudera.com/documentation/enterprise/5-14-x/topics/impala_string.html

【讨论】:

如果您查看文档的分区部分,它会说,“分区列的数据类型对所需的存储没有显着影响,因为这些列中的值没有存储在数据文件,而是将它们表示为 HDFS 目录名称中的字符串。链接 - docs.cloudera.com/documentation/enterprise/5-9-x/topics/… 正确,它对 HDFS 所需的存储没有太大影响,但如前所述,如果您有很多分区,它会影响内存存储,从而影响性能。跨度> 【参考方案2】:

不,没有这样的建议。考虑一下: 问题是 Hive 中的分区表示是一个名称类似于 'key=value' 的文件夹,或者它可以只是 'value' 但无论如何它是字符串文件夹名称。所以它被存储为字符串并在读/写期间被强制转换。分区键值未打包在数据文件中,也未压缩。

由于 map-reduce 和 Impalla 的分布式/并行特性,您永远不会注意到查询处理性能的差异。此外,所有数据都将被序列化以在处理阶段之间传递,然后再次反序列化并转换为某种类型,对于同一个查询,这可能会发生多次。

分布式处理和序列化/反序列化数据会产生大量开销。实际上只有数据的大小很重要。表(文件大小)越小,它的工作速度就越快。但是你不会通过限制类型来提高性能。

用作分区键的大字符串值会影响元数据数据库的性能,并且正在处理的分区数量也会影响性能。还是一样:这里只有数据的大小很重要,而不是类型。

1, 0 可以比'Yes', 'No' 更好,只是因为大小。在许多情况下,压缩和并行性可以使这种差异可以忽略不计。

【讨论】:

当我们将数据写入这些表时,我认为分区是一种按查询分组。在 iintgers 上 Group by 执行将比在字符串上更快。这个角度的任何想法。 @Achyuth 例如,GUID 与 Int 在 group by 和 join 方面没有区别。因为高度并行,并且因为它正在使用 http 进行序列化/反序列化和传输。而且 Map-reduce 并行执行在性能上增加了如此多的随机性,以至于您无法以相同的结果重复您的实验。

以上是关于使用字符串分区键与整数分区键的 Hive/Impala 性能的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用整数类型作为分区键可以最大限度地减少内存使用?

一个具有许多分区键的 Azure 表存储表与许多具有较少分区键的表相比如何?

kafka主题分区的数量和数据中不同键的数量

带有分区键的 cassandra getendpoints 有空间

如何使用基于分区键的 Azure 流分析查询数据

Azure 表:选择分区/行键的最佳实践