带有字符串分区键和整数分区键的Hive / Impala性能

时间:2018-08-29 16:24:41

标签: apache-spark hive impala

是否建议将数字列用作分区键?当我们对数字列分区和字符串列分区进行选择查询时,性能会有所不同吗?

2 个答案:

答案 0 :(得分:3)

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

我将不再赘述,而是从文档中粘贴该部分,因为我认为它说得很好:

  

“尽管使用STRING列作为分区键可能会很方便,即使这些列包含数字,但出于性能和可伸缩性的考虑,在可行的情况下最好使用数字列作为分区键。尽管底层HDFS目录名称可能是不管哪种情况,如果将诸如YEAR,MONTH,DAY等分区键列声明为INT,SMALLINT等,则分区键列的内存存储空间会更紧凑,计算速度也会更快。 “

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

答案 1 :(得分:1)

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

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

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

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

。 仅仅因为大小,

1, 0会比'Yes', 'No'更好。在许多情况下,压缩和并行性可以使这种差异微不足道。