这篇文章主要讲解了“怎么让 PigPen 支持本地代码和命名空间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么让 PigPen 支持本地代码和命名空间”吧!
在介绍 PigPen 的文章中,作者在 Future Work 一节中提到,我们在 PigPen 中不能调用本地声明的代码。例如一下代码在最后生成的 Pig 脚本中是执行不了的,会报找不到符号 foo
的错误:
(ns test.core (:require [pigpen.core :as pig])) (defn foo [x] …) (pig/map foo)
这样就只能把所有 foo
函数要做的事情全部写在 pig/map
后面。如果 foo
要做的事情很多,代码很长,那么写出来的代码将非常难看。
PigPen 不光不支持本地代码的调用,还不支持 namespace 的引用(https://groups.google.com/forum/#!msg/pigpen-support/-Kd06UfzxEU/vYEAZvmZLFcJ)。
这些在任何编程语言中都看似很自然的功能在初期的 PigPen 中都不支持。其实这里的每一个本地代码的调用或者其他 namespace 中函数的调用在最后写成 Pig 脚本后都是一个 UDF,而 PigPen 的目的之一也就是要取代 Pig 脚本和 UDF混写的方式,所以应该会有解决的办法,但没时间(也懒)去扒源代码去想办法处理这种情况,于是到 GitHub 上找到主要的贡献者 Matt Bossenbroek,向他发邮件请教。
Matt 指出如果要用调用本地代码需要这样做:
(ns test.core (:require [pigpen.core :as pig])) (defn foo [x] …) (pig/map (do (require 'test.core) foo))
我尝试了一下,好像并不能达到预期的效果。
于是我试着改变一下生成的 Pig 脚本,看能不能运行起来。反正最后部署到集群上运行的时候也是用的生成的 Pig 脚本文件。在生成的 Pig 脚本中,所有的 Clojure 代码都被 pigpen.PigPenFn*
一组类(PigPenFnBoolean
,PigPenFnString
,PigPenFnTuple
,PigPenFnDataBag
,PigPenFnDataByteArray
)包装成 UDF 插入到最终生成的 Pig 脚本中,不同的后缀返回不同的 Pig 基本类型的值。
在生成的 Pig 脚本中,这些类的第一个参数都是 '(clojure.core/require (quote [pigpen.pig]))'
,看一下代码知道这个参数会被当做 Clojure 代码读入来做初始化用,所以应该在这里加上要包含的 namespace。试了一些果然可以运行了。再看一下代码发现要通过 PigPen 的方法来添加这个 require
也不好弄,就打算先用 PigPen 生成 Pig 脚本,然后在这里加上另外要包含的 namespace(写一个脚本往每个这样的类里面加上 namespace 也不会太麻烦)。
同时也顺带问一下 Matt 怎么利用 PigPen 来做,Matt 说正在考虑用什么样的方式来支持引用 namespace。结果在大年初二早上收到邮件说新版本的 PigPen([com.netflix.pigpen/pigpen "0.1.4"]) 可以支持了,并给出了一个例子:
(ns pigpen-demo.core (:require [pigpen.core :as pig] [clojure.string :as str])) (defn square [x] (* x x)) (defn my-query [] (->> (pig/return [1 2 3]) (pig/map square) (pig/map (fn [x] (square x))) (pig/into []) (pig/map #(str/join "," %)) (pig/dump)))
但是一定要把整个项目打包成一个 uberjar 分发到集群上去。这样基本上可以把 PigPen 用到我的实验性的工作中去了(production 环境不允许乱用新东西)。
感谢各位的阅读,以上就是“怎么让 PigPen 支持本地代码和命名空间”的内容了,经过本文的学习后,相信大家对怎么让 PigPen 支持本地代码和命名空间这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。