1

目前我们存储的很多数据都是以 avro 记录或序列化 protobuf 字节的形式存储的。我想看看如何为我的数据设计一个有效的模式,以提高数据管道的读取/解析序列化速度。

例如考虑以下情况

Schema A : Column 1 : columnName : "eventType", type : string
           Column 2 : ColumnName : "Data", type : bytes

Schema B : Column 1 : columnName : "DataEventTypeA" : bytes
           Column 2 : columnName : "DataEventTypeB" : bytes
           Column 3 : columnName : "DataEventTypeC" : bytes
           ... so on basically flattening out Data column for each evenType

在我当前的设置中,我有多个管道以格式模式 A 读取数 TB 的数据,然后根据 eventType 过滤掉大量数据。一些 eventType 非常罕见,因此即使很少见,它们仍然必须读取 TB 的数据,然后过滤掉其中的大部分即使模式 B 看起来更丑,但是因为我知道在给定管道中为给定的偶数类型读取哪个特定列我可以在 avro 或 proto 中创建投影模式(即只有我想要读取/反序列化的字段),然后解析器将忽略未知列,并且与模式 A 相比,读取和反序列化的数据要少得多。所以管道处理一个罕见的事件读取的数据要少得多,而不是 TB,尽管我同意我的代码将 eventtypes 映射到 schema 和 columnnames 会稍微难看。

那么,鉴于我的用例,与窄表和长表相比,我是否应该考虑更喜欢宽列模式?还是我在做一些反设计模式。我知道列式存储会更好,但是因为我的事件都是记录格式,所以我缺少什么明显的缺点吗?

4

0 回答 0