自己怎么做网站啊,优秀甜品网站,宁波网站建设科技有限公司,建网站提供下载背景
2010年 google 发表了一篇论文《Dremel: Interactive Analysis of Web-Scale Datasets》#xff0c;介绍了其 Dermel 系统是如何利用列式存储管理嵌套数据的#xff0c;嵌套数据就是层次数据#xff0c;如定义一个班级#xff0c;班级由同学组成#xff0c;同学的信…背景
2010年 google 发表了一篇论文《Dremel: Interactive Analysis of Web-Scale Datasets》介绍了其 Dermel 系统是如何利用列式存储管理嵌套数据的嵌套数据就是层次数据如定义一个班级班级由同学组成同学的信息有学号、年龄、身高等。
Parquet 是 Dremel 的开源实现作为一种列式存储文件格式2015年称为 Apache 顶级项目后来被 Spark 项目吸收作为 Spark 的默认数据源在不指定读取和存储格式时默认读写 Parquet 格式的文件。
今天不介绍嵌套数据是如何映射到每一列了简单来说就是把不同层级的属性拍到一级类似降维打击。这样一个嵌套数据可以看成独立的多个属性每一个属性就是一列和表结构差不多。
写流程
虽然是按列存储但数据是一行一行来的那什么时候将内存中的数据写文件呢我们知道文件只能顺序写假如每收到一行数据就写入磁盘那就是行式存储了。
一个解决方案是为每个列开一个文件假如数据有 n 个属性就需要 n 个文件每次写数据就需要追加到 n 个文件中。但是对于文件格式来说用户肯定希望把复杂的数据存到一个文件中而不希望管理一堆小文件可以想象你做了一个ppt每一页存成了一个文件所以一个 Parquet 文件中必须存储数据的所有属性。
另一个解决方案是在内存中缓存一些数据等缓存到一定量后将各个列的数据放在一起打包这样各个包就可以按一定顺序写到一个文件中。这就是列式存储的精髓按列缓存打包。
文件格式
按照上边这种方式Parquet 在每一列内也需要分成一个个的数据包这个数据包就叫 PagePage 的分割标准可以按数据点数如每1000行数据打成一个 Page也可以按空间占用如每列的数据攒到8KB合成一个 Page。
一个 Page 的数据就是一列类型相同在存储到磁盘之前一般都会进行编码压缩为了快速查询、也为了解压缩这一个 Page在写的时候先统计一下最大最小值叫做 PageHeader存储在 Page 的开头其实就是 Page 的 元数据metadata。PageHeader 后边就是数据了读取一个 Page 时可以先通过 PageHeader 进行过滤。
Parquet 又把多个 Page 放在一起存储叫 Column Chunk。于是每一列都由多个 Column Chunk 组成并且也有其对应的 ColumnChunk Metadata。注意这只是一个完整数据的一个属性一个数据的多个属性要放在多个 Column Chunk 的这多个 Column Chunk 放在一起就叫做一个 Row Group。
下边这就是 Parquet 官方介绍
magic number 就类似水印最后有整个文件的 Metadata。还是看图吧Parquet 的官方文件格式图是下面这样的 左边是数据右边是 File Metadata。如果觉得太复杂了可以看我画的简洁版 是不是清爽很多File Metadata 中有对应的 Row Group Metadata里面还有 Column Chunk Metadta和数据的组织形式类似就不展开画了。
Parquet 的接口就不介绍了有兴趣的去吧
https://github.com/apache/parquet-format
列式存储文件格式到底有多列取决于每列在内存中缓存的数据量由于同一列的各个 Page 相互独立如果每个 Page 只缓存一个数据点就退化成行式存储了比行式存储还差。因此列式存储有一个需要注意的就是列不能太多这是个大坑。