使用Scalding JobTest模拟TSV源

时间:2014-04-14 21:47:51

标签: scala mocking tsv scalding

我很难为我的烫伤工作进行单元测试。

我的工作需要一个包含三个字段的文件:

  TextLine(args("input"))
    .map('url -> ('fetchedUrl,'date,'info)){
  ...

天真的我会期望字段被映射为nTuple,而无需任何进一步的设置。但是从我的测试中我发现它不是那样的,需要建立一些进一步的合同:

JobTest[com.kohls.crawler.Miner]
  .arg("input", "inputFile")
  .arg("output", "outputFile")
  .source(TextLine("inputFile"), List(("https://en.wikipedia.org/wiki/Test" ,"Mon Apr 14 15:08:11 CDT 2014", "extra info")))
  .sink[(String,Date,Array[Byte])](Tsv("outputFile")){ ... }

目前这与cascading.tuple.FieldsResolverException: could not select fields: [{1}:'url'], from: [{2}:'offset', 'line']失败。所以我猜测我需要以某种方式声明TSV字段,然后再将它作为TextLine的输入提供。

我发现的大多数文档在这方面都不稳定。 定义此测试的正确原因是什么?

2 个答案:

答案 0 :(得分:3)

您应该使用Tsv代替TextLineTsv将声明的字段作为第二个输入参数。你的工作看起来像这样:

Tsv(args("input"), ('fetchedUrl,'date,'info), skipHeader = false/true).read
  .map(...)
  .write(Tsv(args("output"), writeHeader = false/true)

你的工作测试如下:

JobTest[com.kohls.crawler.Miner]
  .arg("input", "inputFile")
  .arg("output", "outputFile")
  .source(Tsv("inputFile"), List(("https://en.wikipedia.org/wiki/Test" ,"Mon Apr 14 15:08:11 CDT 2014", "extra info")))
  .sink[(String,Date,Array[Byte])](Tsv("outputFile")) { ... }
  .run
  .finish

答案 1 :(得分:2)

当然,您可以在测试中模拟TextLine。诀窍是提供隐藏的'line字段。

    JobTest[com.kohls.crawler.Miner]
      .arg("input", "inputFile")
      .arg("output", "outputFile")
      .source(TextLine("inputFile"), List((
        0 -> "https://en.wikipedia.org/wiki/Test" , 
        1 -> "Mon Apr 14 15:08:11 CDT 2014", 
        2 -> "extra info")))
      .sink[(String,Date,Array[Byte])](Tsv("outputFile")){ ... }