目录

Delta-Lake系列-测试用例

概述

学习开源项目,另外一个重点就是看看测试用例,优秀的项目,一般会提供一些本地能跑,方便学习者深入 Debug 的测试方法。

由于 Delta Lake 刚刚开源,代码也在快速迭代,所以以下测试用例在后面的发布中未必还会存在的,各位读者请注意。

代码是在 da3734e62b6698045a4e2b07286aac7f24cee44b 这个 commit 上。

Delta Lake测试用例

目录结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/Users/runzhliu/workspace/delta/src/test
├── resources
│   └── log4j.properties
└── scala
    └── org
        └── apache
            └── spark
                └── sql
                    └── delta
                        ├── ActionSerializerSuite.scala
                        ├── DeltaSinkSuite.scala
                        ├── DeltaSourceSuite.scala
                        ├── DeltaSuiteOSS.scala
                        ├── DeltaTimeTravelSuite.scala
                        ├── FileNamesSuite.scala
                        └── LogStoreSuite.scala

7 directories, 8 files

Delta Lake 代码量还很少,所以测试用例也相对比较少。下面挑选一些值得学习的测试用例简单分析一下。

ActionSerializerSuite

如命所示,这个测试用例就是用来测试 Action 方法序列化/反序列化 json 的一个类。所有的这些 Action 都继承了 Action 这个接口,提供了了一个 def json 的方法,用于把 Action 转化为 Json 格式记录在事务日志里。

1
2
3
4
5
6
7
8
9
/**
 * Represents a single change to the state of a Delta table. An order sequence
 * of actions can be replayed using [[InMemoryLogReplay]] to derive the state
 * of the table at a given point in time.
 */
sealed trait Action {
  def wrap: SingleAction
  def json: String = JsonUtils.toJson(wrap)
}

关于 Action 类,提供了很多方法,封装了增删(改其实是一次增和一次删的操作)日志文件的一些操作。

关于 AddFile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
case class AddFile(
    path: String,
    partitionValues: Map[String, String],
    size: Long,
    modificationTime: Long,
    dataChange: Boolean,
    @JsonRawValue
    stats: String = null,
    tags: Map[String, String] = null) extends FileAction {
  require(path.nonEmpty)

  override def wrap: SingleAction = SingleAction(add = this)

  def remove: RemoveFile = removeWithTimestamp()

  def removeWithTimestamp(
      timestamp: Long = System.currentTimeMillis(),
      dataChange: Boolean = true): RemoveFile = {
    // scalastyle:off
    RemoveFile(path, Some(timestamp), dataChange)
    // scalastyle:on
  }
}

Delta Lake 写数据文件的时候标示为 add,以下是事务日志中的增加文件的记录。

1
{"add":{"path":"part-00002-beed6b49-549c-4888-aa64-838d39cac0e8-c000.snappy.parquet","partitionValues":{},"size":423,"modificationTime":1557986707000,"dataChange":true}}

测试类中,有关于这个 json 的序列化和反序列化的测试,同学们可以自己跑跑看看。关于 RemoveFile 就不赘述了。

LogStoreSuite

总结

目前 Delta Lake 还是在 0.1.0 的版本,代码里有很多地方不完善,比如说 Optimize 的实现几乎是空的,因此目前版本的 Delta Lake 并不提供像商业版那样的一些优化操作,要上生产环境还需要继续等待,按照其 Road Map,在六月份和七月份都会有新的版本发布,大家一起期待一下吧!

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。