Смоделируйте источник TSV с помощью Scalding JobTest

Мне трудно сделать модульный тест для моей обжигающей работы.

Моя работа ожидает файл с тремя полями:

  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.

Большая часть документации, которую я нашел, неверна в этом отношении. Как правильно определить этот тест?


person tutuca    schedule 14.04.2014    source источник


Ответы (2)


Вы должны использовать 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
person Marius Soutier    schedule 15.04.2014
comment
В порядке. получил это там. Но потребительская часть (код, который выполняется тестом, выдает ключевую ошибку): by: java.util.NoSuchElementException: key not found: Tsv(inputFile,'fetchedUrl', 'date', 'info',false,false) - person tutuca; 29.04.2014
comment
ммм, не должно быть... Разве этот аргумент не просто способ сопоставить данные с каким-то символом? какая разница какое у него имя? - person tutuca; 29.04.2014
comment
Ах, хорошо... Да, это проблемы с форматированием трассировки. Код использует только символы... - person tutuca; 29.04.2014
comment
Тогда ошибка должна быть внутри вашей работы. Я бы посоветовал сначала выполнить очень простую работу, чтобы убедиться, что проблема не в тестовом примере. - person Marius Soutier; 30.04.2014

Конечно, вы можете издеваться над 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")){ ... }
person piggybox    schedule 14.10.2015