使用'*关键字刻录如何在所有字段上进行映射?

时间:2014-03-12 17:56:56

标签: scala scalding

我想将操作应用于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) }

3 个答案:

答案 0 :(得分:1)

在Scalding Fields API中,为了从'*映射到'*,我能想到的最佳方法是级联TupleEntrycascading.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