如何使用安全类型 API 模拟用于 Scalding 的 TextLine?
How to mock a TextLine for Scalding using the type safe API?
我正在尝试为 Scalding 作业模拟 TextLine
,但偏移量似乎与线混合在一起,无论我是显式还是隐式表示偏移量。
这是我的工作:
package changed
import com.twitter.scalding._
import com.twitter.scalding.typed.TDsl._
class MyJob(args: Args) extends Job(args) {
val mySource = TextLine(args("input"))
val myPipe : TypedPipe[String] = mySource
.read
.debug
.toTypedPipe[String]('line)
.debug
.write(TypedTsv[String](args("output")))
}
请注意,我记录了转换为安全类型之前和之后的元组 API。
这是我的测试:
package changed
import com.twitter.scalding.{JobTest, TextLine, TypedTsv, TupleConversions}
import org.scalatest.FunSpec
class MyTest extends FunSpec with TupleConversions {
val Input = "/tmp/testInput"
val Output = "/tmp/testOutput"
val Data1 = List((0 -> "line0", 1 -> "line1", 2 -> "line2"))
val Data2 = List((0, "line0", 1, "line1", 2, "line2"))
val Data3 = List(("line0", "line1", "line2"))
JobTest("sandcrawler.MyJob")
.arg("test", "")
.arg("app.conf.path", "app.conf")
.arg("output", Output)
.arg("input", Input)
.arg("debug", "true")
.source(TextLine(Input), Data1)
.sink[String](TypedTsv[String](Output)) {
outputBuffer =>
it("should return a 3-element list.") {
assert(outputBuffer.size === 3)
}
}
.run
.finish
}
如果我从常量列表Data1
中获取输入,如上所示,两次调用debug
输出的元组分别是:
['(0,line0)', '(1,line1)']
['(1,line1)']
如果我从 Data2
获得输入,debug
输出是:
['0', 'line0']
['line0']
如果我从 Data3
获得输入,debug
输出是:
['line0', 'line1']
['line1']
所有运行均未通过测试并显示相同的错误消息:
[info] MyTest:
[info] - should return a 3-element list. *** FAILED ***
[info] 1 did not equal 3 (MyTest.scala:23)
换句话说,只写了一个元组。
我应该如何 represent/access 我的模拟数据?
在这种特定情况下,问题在于 Data1
周围的额外括号组。如果您改写:
val Data1 = List(0 -> "line0", 1 -> "line1", 2 -> "line2")
您应该得到预期的输出:
['0', 'line0']
['line0']
['1', 'line1']
['line1']
['2', 'line2']
['line2']
我正在尝试为 Scalding 作业模拟 TextLine
,但偏移量似乎与线混合在一起,无论我是显式还是隐式表示偏移量。
这是我的工作:
package changed
import com.twitter.scalding._
import com.twitter.scalding.typed.TDsl._
class MyJob(args: Args) extends Job(args) {
val mySource = TextLine(args("input"))
val myPipe : TypedPipe[String] = mySource
.read
.debug
.toTypedPipe[String]('line)
.debug
.write(TypedTsv[String](args("output")))
}
请注意,我记录了转换为安全类型之前和之后的元组 API。
这是我的测试:
package changed
import com.twitter.scalding.{JobTest, TextLine, TypedTsv, TupleConversions}
import org.scalatest.FunSpec
class MyTest extends FunSpec with TupleConversions {
val Input = "/tmp/testInput"
val Output = "/tmp/testOutput"
val Data1 = List((0 -> "line0", 1 -> "line1", 2 -> "line2"))
val Data2 = List((0, "line0", 1, "line1", 2, "line2"))
val Data3 = List(("line0", "line1", "line2"))
JobTest("sandcrawler.MyJob")
.arg("test", "")
.arg("app.conf.path", "app.conf")
.arg("output", Output)
.arg("input", Input)
.arg("debug", "true")
.source(TextLine(Input), Data1)
.sink[String](TypedTsv[String](Output)) {
outputBuffer =>
it("should return a 3-element list.") {
assert(outputBuffer.size === 3)
}
}
.run
.finish
}
如果我从常量列表Data1
中获取输入,如上所示,两次调用debug
输出的元组分别是:
['(0,line0)', '(1,line1)']
['(1,line1)']
如果我从 Data2
获得输入,debug
输出是:
['0', 'line0']
['line0']
如果我从 Data3
获得输入,debug
输出是:
['line0', 'line1']
['line1']
所有运行均未通过测试并显示相同的错误消息:
[info] MyTest:
[info] - should return a 3-element list. *** FAILED ***
[info] 1 did not equal 3 (MyTest.scala:23)
换句话说,只写了一个元组。
我应该如何 represent/access 我的模拟数据?
在这种特定情况下,问题在于 Data1
周围的额外括号组。如果您改写:
val Data1 = List(0 -> "line0", 1 -> "line1", 2 -> "line2")
您应该得到预期的输出:
['0', 'line0']
['line0']
['1', 'line1']
['line1']
['2', 'line2']
['line2']