在幻灯片 36 和 37 的演示文稿中,Cascalog 的作者断言,给定一组姓名和年龄的数据,例如:[name age],返回所有大于平均年龄的结果的查询是 300 行 PIG。
这是一个有效的断言吗?真的有多少行PIG?
还是他描述的问题比我描述的更大?
(免责声明——我是 Nathan 的作品、Clojure 和 Cascalog 的忠实粉丝——我只是想弄清楚一些事实)。
你误解了他在这个演讲中所说的话。他的意思是,PIG 中的“平均”实现是 300 行 Java 代码,而宏谓词功能实现的 5 行 cascalog。他想强调构图的力量。
PD:对不起我的英语不好,我正在学习;-)
我认为 PIG 中不会有 300 行代码。PIG 已经具有过滤器构造和 AVG 评估功能。PIG 中的代码类似于:
A = LOAD 'student.txt' AS (name:chararray, age:int);
B = FILTER A BY age > AVG(A.age);
注意:我没有尝试过此代码,因为我的机器上没有 PIG 设置。
在常规 SQL 中,这是微不足道的 - select count(*) from TableName where age>(select avg age from TableName)
但它要求底层引擎能够检测到最新的选择是独立的子查询(否则它将永远工作)。
将其分为两个运算符应该是微不足道的 - 一个选择平均年龄,第二个 - 在它上面计算这些。
选择已经在 PIG 中实现的聚合操作可能会混淆消息。
正如@marivas11 所指出的那样,这些幻灯片的一个主题是谓词的可组合性是其他 Hadoop 抽象中流行的用户定义函数 (UDF) 方法的强大替代方案。
可组合性的好处远远超出了代码量的相对差异:
谓词的可组合性降低了 Moseley/Marks 2006 中定义的“意外复杂性”,这有利于软件工程成本
结果的简洁代码也非常接近规定的要求;这几乎直接来自测试驱动开发 (TDD) 的实践,因为 Cascalog 子查询有效地成为测试语句——Sam Ritchie 的Cascalog-Midje添加事实和模拟非常好
摆脱 UDF 为必须开发复杂工作流程的数据团队解决了一个非常棘手的问题:跨越语言边界从 Java 到 Pig 的 DML 再回到 Java 意味着异常处理、通知和其他工具变得更加困难——尤其是对于大型- 规模的应用程序,无论如何都很难在大型集群上进行故障排除......在 Cascalog 中,所有扩展都保持在同一种语言中(甚至 Leiningen 构建脚本也在 Clojure 中),因此编译器可以完整地查看工作流程并且可以比 PIG 更早地推断问题。
后一点很微妙,但在实践中转化为 $$。在 PIG 中,在您的应用程序在集群上运行之前,您不会发现许多问题。对于大型应用程序,这意味着要花钱测试可能在编译时或提交之前在 Hadoop 客户端上推断的错误。