压缩小文件

数据湖可以积累很多小文件,特别是当执行增量更新时。文件小,读取速度就会变慢。可以用Spark压缩Delta Lake中的小文件。通过压缩将小文件合并到大文件中是保持快速读取的一种重要的数据湖维护技术。

下面创建一个包含1000个文件的Delta数据湖,然后将文件夹压缩为只包含10个文件。首先构造一个DataFrame,将其重分区为1000个分区,这样在存入Delta Lake时就会生成1000个小的存储文件,代码如下:

// 先构造一个DataFrame
val df = spark.range(0, 10000).toDF("number")

// 创建具有1000个文件的Delta Lake
df.repartition(1000)
  .write
  .format("delta")
  .save("/data_lake/delta_lake/compact")

查看_delta_log下相应的日志文件00000000000000000000.json,命令如下:

$ hdfs dfs -cat /data_lake/delta_lake/compact/_delta_log/00000000000000000000.json

会看到其中包含有1000行类似下面这样的json行(为了便于阅读,这里格式化显示其中一行),内容如下:

{
    "add":{
        "path":"part-00000-05e5bda3-f20f-4452-b10a-c675f7557b1d-c000.snappy.parquet",
        "partitionValues":{},
        "size":525,
        "mod ......
          

......

抱歉,只有登录会员才可浏览!会员登录


《Spark原理深入与编程实战》