做网站激励语,pc网站制作公司,做民宿哪家网站最好,网站空间如何买列式存储
在调试flink读取parquet文件时#xff0c;读出来的数据是ColumnarRowData#xff0c;由于parquet是列式存储的文件格式#xff0c;所以需要用一种列式存储的表示方式#xff0c;ColumnarRowData就是用来表示列式存储的一行数据#xff0c;它包含多个数组的数据结…列式存储
在调试flink读取parquet文件时读出来的数据是ColumnarRowData由于parquet是列式存储的文件格式所以需要用一种列式存储的表示方式ColumnarRowData就是用来表示列式存储的一行数据它包含多个数组的数据结构每个数组都代表一个列并且数组中的元素是该列中的值系统可以有效地加载和处理需要的列从而提高查询性能并减少不必要的数据访问和计算。
行存储 GenericRowData与ColumnarRowData都是RowData的实现类前者是标准的行存储所有列的值保存在一维数组Object[] fields中访问某一列只需要指定列的索引即可。
成员变量
vectorizedColumnBatchVectorizedColumnBatch类型一组行数据的集合可以看成一个二维表同一列的值保存在同一个数组中(ColumnVector)。因此要访问某行某列的值需要确定行索引rowId与列索引*posrowId行索引唯一表示某一行。不同的行数据ColumnarRowData中rowId不同vectorizedColumnBatch相同
根据不同列的类型会使用对应的Vector进行存储
HeapBooleanVector
HeapBytesVector
HeapByteVector
HeapDoubleVector
HeapFloatVector
HeapIntVector
HeapLongVector
HeapShortVector
HeapTimestampVector逻辑结构 ParquetColumnarRowSplitReader.nextRecord按行获取数据时只是移动了rowId的偏移量因为数据已经提前在nextBatch批量从parquet文件中加载到了VectorizedColumnBatch中。
示例
对于一个parquet文件有如下数据
id(string)col1(int)name(string)create_date(string)col2(int)201234520202023-07-1954321
生成的ColumnarRowData对象如下 默认以2048批量所以底层数组初始长度都为2048
int类型对应HeapIntVector,底层用buffer:int[]存储一个元素是一个列的值string类型对应HeapBytesVector底层用buffer:byte[]存储第n行的列值由start[n-1]及length[n-1]可定位到对应的字节第一行的name字节为[50,48,50,48]即“2020”