有了前面章节的铺垫,相信你已经知道,delta表其实是由两部分组成的:
为了给大家更直观的看下Delta目录结构到底是啥样,我截取了一张图:
key=a,key=b有没有非常熟悉的感觉?是不是和hive里分区表非常类似?没错,他就是一个分区字段。进去看看其实就是一些parquet文件。如果delta表没有分区字段,那么这些parquet文件都会在根目录里。
如果只是一堆的parquet文件,就无法支持delta的各种功能了。所以delta的真正神奇魔法都在_delta_log目录里。我们进去看看:
太棒了,是json文件,这意味着我们可以直接打开看看里面,而不需要专门写程序去看。根据我们前面所学的知识,delta将所有的对数据的操作都转化为了对文件的两个操作,而_delta_log 则是记录这两个操作的日志。现在让我们打开文件见证下我们之前的说法是不是对的:
commitInfo表示一次写入(更新或者新增或者删除或者混合),里面我们看到了分区字段,版本号以及操作是WRITE. 那操作的具体文件是什么呢?我们看到下面有两条记录,都是add操作,里面有相应的路径,分区信息以及大小,修改创建时间等等。
哇,和我们之前的讨论一模一样!你会发现,delta目录结构是如此的简单,元信息都可以肉眼可见,而数据则是以我们非常熟悉的parquet文件格式存储。
常见疑问
Q1: 随着更新次数的增长,meta(_delta_log)里的json文件会不会很多,性能岂不是很低?
确实如此,但是delta 会每 N(默认是10)个json文件后将之前的所有json文件合并成一个parquet文件,这样只要读取最近的10个元数据文件即可。 另外遍历目录是个昂贵的操作,读取数据parquet文件时,delta不会去遍历,而是根据meta里记录的文件集合去加载过滤数据。