我想将操作应用于Pipe的所有字段。我在https://github.com/twitter/scalding/wiki/Fields-based-API-Reference看到了 那 "您可以使用' *(此处和其他地方)表示所有字段。" 但不知何故,我没有成功让它发挥作用。有人会好心地向我展示一个例子吗?
最初我有类似
的东西mySource.map('field1 -> 'field1){ number: String => number.trim }
我现在想要应用于所有字段
mySource.map('* -> '*){ numbers: List[String] => numbers.map(_.trim) }
答案 0 :(得分:1)
在Scalding Fields API中,为了从'*
映射到'*
,我能想到的最佳方法是级联TupleEntry
,cascading.tuple.TupleEntry
import com.twitter.scalding._
import cascading.tuple.TupleEntry
// Notice I do not specify the scheme when reading.
// I only know first column is 'user_id', the rest is some value and I want
// to double the values. You can use 'map' or 'mapTo'.
Tsv(args("input"))
.read
.map('* -> '*) {
fields: TupleEntry =>
val sz: Int = fields.size()
for (i <- from 1 until sz) fields.setDouble(i, fields.getDouble(i) * 2.0)
fields.getTuple()
}
.write(Tsv(args("output")))
答案 1 :(得分:0)
'*
运算符似乎只与mapTo
和完整类型注释一起使用。
mySource
.mapTo[(String,String,String),(String,String,String)]('* -> '*) { case (a: String, b: String, c: String) =>
(a.trim, b.trim, c.trim)
}
答案 2 :(得分:0)
例如,这适用于Scalding 0.11.0(当前答案都没有按原样运行):
mySource
.mapTo('* -> '*) {
entry: TupleEntry =>
for (i <- 0 until entry.size) {
if (entry.getObject(i) == null) entry.setRaw(i, "\\N")
}
entry.getTuple
}
基本上mapTo('* -> '*)
- &gt; entry.getTuple
。