是否建议将数字列用作分区键?当我们对数字列分区和字符串列分区进行选择查询时,性能会有所不同吗?
答案 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'
更好。在许多情况下,压缩和并行性可以使这种差异微不足道。