快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

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

这篇文章主要讲解了“怎么让 PigPen 支持本地代码和命名空间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么让 PigPen 支持本地代码和命名空间”吧!

成都创新互联公司是一家专注于做网站、成都网站设计与策划设计,海宁网站建设哪家好?成都创新互联公司做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:海宁等地区。海宁做网站价格咨询:18982081108

在介绍 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 支持本地代码和命名空间这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


当前文章:怎么让PigPen支持本地代码和命名空间
分享链接:http://6mz.cn/article/pgggdi.html

其他资讯