Scalding:从Pipe中的列创建列表

时间:2015-03-25 14:41:03

标签: scala scalding

我需要使用一个带有一列带有关联值的标签的管道,然后转动该管道,以便每个标签都有一列,每列中都有正确的值。举个例子,如果我有这个:

Id  Label Value 
1   Red   5
1   Blue  6
2   Red   7
2   Blue  8
3   Red   9
3   Blue  10

我需要把它变成这个:

ID Red Blue
1  5   6
2  7   8
3  9   10

我知道如何使用pivot命令执行此操作,但我必须明确知道标签的值。如何将“label”列中的标签动态读取到列表中,然后我可以将其传递给pivot命令?我试图创建列表:

pipe.groupBy('id) {_.toList('label) }

,但我得到一个类型不匹配,说它找到了一个符号,但期待(cascading.tuple.Fields,cascading.tuple.Fields)。此外,从在线阅读,听起来像使用toList是不受欢迎的。 'label中的东西数量是有限的而不是那么大(可能是30-50项),但可能会有所不同,具体取决于我正在使用的数据样本。

你提出的任何建议都会很棒。非常感谢!

2 个答案:

答案 0 :(得分:1)

我认为你走在正确的轨道上,你只需要将所需的值映射到符号:

val newHeaders = lines
    .map(_.split(" "))
    .map(a=>a(1))
    .distinct
    .map(f=>Symbol(f))
    .toList

出于性能原因,Execution类型将帮助您与后续数据透视表结合使用。

请注意,我正在为lines变量使用TypedPipe。

如果您希望您的代码简洁,您可以将第1行和第1行组合在一起。 2,但这只是一种风格选择:

map(_.split(" ")(1))

答案 1 :(得分:0)

尝试使用Execution从数据中获取值列表。有关执行的更多信息:https://github.com/twitter/scalding/wiki/Calling-Scalding-from-inside-your-application