【发布时间】:2018-08-29 16:24:41
【问题描述】:
是否建议将数字列用于分区键?当我们对数字列分区和字符串列分区进行选择查询时,会不会有任何性能差异?
【问题讨论】:
标签: apache-spark hive impala
是否建议将数字列用于分区键?当我们对数字列分区和字符串列分区进行选择查询时,会不会有任何性能差异?
【问题讨论】:
标签: apache-spark hive impala
好吧,如果您查看 Impala 官方文档会有所不同。
我将粘贴文档中的部分,而不是详细说明,因为我认为它说明得很好:
“尽管使用 STRING 列作为分区键可能很方便,即使这些列包含数字,但为了性能和可伸缩性,只要可行,最好使用数字列作为分区键。虽然底层 HDFS 目录名称可能是无论哪种情况,如果将 YEAR、MONTH、DAY 等分区键列声明为 INT、SMALLINT 等,则分区键列的内存存储更紧凑,计算速度更快。 "
参考:https://www.cloudera.com/documentation/enterprise/5-14-x/topics/impala_string.html
【讨论】:
不,没有这样的建议。考虑一下:
问题是 Hive 中的分区表示是一个名称类似于 'key=value' 的文件夹,或者它可以只是 'value' 但无论如何它是字符串文件夹名称。所以它被存储为字符串并在读/写期间被强制转换。分区键值未打包在数据文件中,也未压缩。
由于 map-reduce 和 Impalla 的分布式/并行特性,您永远不会注意到查询处理性能的差异。此外,所有数据都将被序列化以在处理阶段之间传递,然后再次反序列化并转换为某种类型,对于同一个查询,这可能会发生多次。
分布式处理和序列化/反序列化数据会产生大量开销。实际上只有数据的大小很重要。表(文件大小)越小,它的工作速度就越快。但是你不会通过限制类型来提高性能。
用作分区键的大字符串值会影响元数据数据库的性能,并且正在处理的分区数量也会影响性能。还是一样:这里只有数据的大小很重要,而不是类型。
1, 0 可以比'Yes', 'No' 更好,只是因为大小。在许多情况下,压缩和并行性可以使这种差异可以忽略不计。
【讨论】: