1

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

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

  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 的输入。

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

4

2 回答 2

3

您应该使用Tsv而不是TextLine. Tsv将声明的字段作为第二个输入参数。你的工作应该是这样的:

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
于 2014-04-15T08:38:01.603 回答
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")){ ... }
于 2015-10-14T20:58:09.513 回答