在大数据系统中,我们总是不可避免的会遇到嵌套结构的数据。这是因为,在很多场景下,嵌套数据结构能更好的表达数据内容与层级关系,因此很多数据源会采用这样的结构来输出数据。然而,相比关系型的结构化数据,这样的数据并不利于高效查询,因此在很多场景下,我们还会通过ETL将其变为扁平结构的数据来存储。
2010年,Google发表了论文Dremel: Interactive Analysis of Web-Scale Datasets,阐述了一种针对嵌套数据的交互式查询系统,为业界提供了思路。正如官方文档所述,Parquet在最初设计时,便借鉴了Dremel的数据模型思想,支持嵌套结构的存储。当然,Parquet只是一种列式存储格式,要完成类似Dremel的查询功能,还需要计算引擎的配合。
Parquet is built from the ground up with complex nested data structures in mind, and uses the record shredding and assembly algorithm described in the Dremel paper. We believe this approach is superior to simple flattening of nested name spaces.
本文主要探讨Parquet是如何支持嵌套结构存储的。搞清楚这些,能帮助我们更好的设计数据存储方式、选择合适的查询引擎。本文将采用下面的3条数据来进行阐述,后面用“示例”来代表。另外,文中所述是基于Spark 2.4.0、Parquet 1.10.0的。
Record 1:
{
"sid":"8509_1576752657",
"appid":[81, 205, 67],
"tcp": {
"mss": 1750,
"flag": 344