您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么讓 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。