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

发布时间:2021-07-26 11:54:02 作者:chen
来源:亿速云 阅读:126

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

推荐阅读:
  1. 让Istio比你想象中简单,Rancher新版本宣布支持Istio
  2. C程序中让两个不同版本的库共存

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:gridview实现服务器端和客户端全选的方法有哪些

下一篇:viewstate和datatable动态录入数据的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》