中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么讓 PigPen 支持本地代碼和命名空間

發布時間:2021-07-26 11:54:02 來源:億速云 閱讀:136 作者:chen 欄目:云計算

這篇文章主要講解了“怎么讓 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 支持本地代碼和命名空間這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安阳县| 玉林市| 泸定县| 新营市| 裕民县| 醴陵市| 静安区| 奉节县| 元江| 修水县| 栾城县| 商河县| 军事| 寿阳县| 黄浦区| 高密市| 腾冲县| 韩城市| 镇康县| 墨竹工卡县| 宁蒗| 钟祥市| 电白县| 龙胜| 遂溪县| 和静县| 海安县| 合江县| 丽水市| 虎林市| 珠海市| 乌兰察布市| 镇平县| 长春市| 布尔津县| 伊川县| 曲阳县| 大新县| 凤城市| 方城县| 博白县|