scalding 之数据处理

这部分和 Pig 是比较像的。主要参考了这个页面

map-like function

其实和 PIG 的 foreach generate 的语法作用类似,这里包括 map 与 flatMap,后者会将返回的 list flatten 开,核心的语法是

pipe.map (existingFields -> additionalFields){function}

这会产生一个新的 field,使用的就是 function 部分定义的形式。另一个与其类似的是 mapTo 和 flatMapTo,这会将 existingFields 去掉,使用新的 additionalFields 替换。

另外两个仅仅做 field 选择的是 project 和 discard,前者选择保留下来的 field,后者选择被抛弃的 field。

与 PIG 的 filter by 语法类似的是 filter,

pipe.filter (fields){function}

这里 fields 是参与判断的域,而 function 返回 true/false 表示是否保留当前记录。

与 PIG 的 limit 相似的是 limit 操作,

pipe.limit (number)

与 PIG 的 unique 类似的是这里的 unique,这必须通过一次 map/reduce 来做,而不像前面的操作可以在 mapper 侧完成。

比较不同的是 pack 和 unpack,他们可以将一些 field pack 到一个对象里面(这似乎是将 PIG 里面某个 tuple 转换成为了 Java 的对象),但这必须要求这几个部分都支持 reflection 和通过 default constructor 初始化,且使用 getter/setter 进行赋值。

grouping-like functions

这些与 PIG 的 group by 类似。其一是 groupBy,另外一个是 groupAll(与 group all 类似),

pipe.groupBy(fields){ group => ... }

这里 group 后面的映射可以产生 group 后需要生成的额外的域,对应的 group 对象可以使用 size 返回大小,average (field) 计算均值(和 UDF AVG 类似),sizeAveStdev 计算对应的大小、均值和标准差,makeStr (fields, joiner) 将某个域粘和在一起,toList 转换成 list,另有 sum、count 和 sourtBy 都是比较简单的。还可以通过 take、sortWithTake 取出其中若干个。reducers (n) 设定 reducer 个数。

reduce 和 foldLeft 是用来将 group 好的结果处理的,前者会在 mapper 侧使用 combiner 要求必须满足结合律,后者没有这个需要,语法大致如下

group.reduce(field){function}

一个比较特别的操作是 pivot/unpivot,提供的是行列表示的转换。

joining-like functions

这个和 PIG 的 join、cogroup by 很类似。主要表示两个 pipe 之间的关系。如 joinWithLarger、joinWithSmaller 以及 joinWithTiny 提供了三种可能的 join 情形(分别有一些优化),基本语法例如

pipe1.joinWithSmaller(fields, pipe2)

我们可以通过 joiner 设置 join 时哪些为 null 的时候需要保留,我们只需要 joiner = new Left/Right/OuterJoiner 即可。

与 PIG 的 cross 类似也有 crossWithTiny 这类。

小结

值得注意的是 PIG 在这类问题里面的 function 一般都得使用 UDF 来实现,PIG 本身提供的支持很少。为了简化 UDF 的编写,PIG 使用的策略是让程序员可以使用 scripting language。而 scala 是允许直接嵌入一个 scala 的函数来就地解决问题的。

——————-
And Abraham set seven ewe lambs of the flock by themselves.

Advertisements
scalding 之数据处理

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s