gpt4 book ai didi

hadoop - 哪种 Hadoop 数据类型最适合表示年份的键 - Text 还是 IntWritable?

转载 作者:可可西里 更新时间:2023-11-01 14:31:58 27 4
gpt4 key购买 nike

在我的应用程序中,我需要使用年份作为键值。我认为 Text 更适合 key,因为我们通常按年份对特定度量进行分组,而 IntWritable 用于我们求和或平均的值。但我也认为我们可以使用 IntWritable 作为年份的类型,因为我们可以将年份表示为 int,没有什么可以阻止它,对吗?我想了解哪个更适合一年作为关键 - 是 Text 还是 IntWritable?

最佳答案

两者都适用,但在效率方面存在重要差异。

首先,如果您的记录数量“较少”,那么我将要讨论的内容可能微不足道,不值得担心。但是,如果您计划处理 TB 的数据,那么节省的周期可能加起来长达几分钟。

正如 Amar 在他的回答中指出的那样,文本会将年份值序列化为一系列 UTF-8 编码字符。它实际上输出字节数的 VInt,然后是字节本身。通常年份的长度为 4 个字符,因此年份将被序列化为 5 个字节的数据(1 个字节长度,4 个字节内容)。

IntWritable 总是被序列化为 4​​ 个字节——但是你可以在这个字节空间中保存 +/- 20 亿范围内的数字——显然对你一年的需求来说有点过分了(短的 2 个字节保存 +/- 32k,一个字节保存+/- 128)

因此,在序列化数据时(与 IntWritable 相比),使用 Text 的效率降低了 1 个字节。

要考虑的另一件事是原始比较器如何针对每种类型工作:

Text.Comparator 将跳过表示长度的 vint 字节,然后开始逐字节比较字符 - 因此您需要到达第 5 个字节来比较 2000 年和 2001 年(1 字节长度 + 差异在第 4 个字符中)。但是如果区别在于第一个字符(比如 1999 和 2000 之间),那么原始比较器在第二个字节之后有一个答案。

IntWritable.Comparator 读取每个键的 4 个字节,然后进行 int 比较,因此无论您是否比较数字 123456789 和 1,它都必须先处理每个键的所有 4 个字节,然后才能执行比较。

所以总而言之,Text 的序列化成本更高,但比较成本更低。

根据您的数据域,您还有另一种选择 - 例如,如果您只需要表示从 1970 年开始的年份,那么您可以使用 ByteWritable 来表示 1970 年之后的年份(允许您表示 1970 - 2097 年) ), 并且在比较时只会花费一个字节来序列化和一个字节。

如果您需要表示更大的范围,您还可以使用 VIntWritable,它比 VIntWritable 更有效(可能只需要 2 个字节来存储 1970-9999 范围内的年份)。

关于hadoop - 哪种 Hadoop 数据类型最适合表示年份的键 - Text 还是 IntWritable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14986554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com