微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

怎么让 PigPen 支持本地代码和命名空间

这篇文章主要讲解了“怎么让 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* 一组类(PigPenFnBooleanPigPenFnStringPigPenFnTuplePigPenFnDataBagPigPenFnDataByteArray)包装成 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 支持本地代码和命名空间这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程之家,小编将为大家推送更多相关知识点的文章,欢迎关注!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐