cloj中的RDD和向量

时间:2015-08-06 09:55:15

标签: clojure apache-spark rdd flambo

给定一个函数来过滤掉大于从给定数据集(RDD)的子集确定的最大日期的日期,因此使用确定的最大日期来检查给定向量是否包含大于最大日期的日期值决心 我尝试了以下方法:

(defn future-rows
  "input = { :col val :qty-col val}
   :col = Date column reference"
   [ row input ]
   (let [{:keys [ col qty-col ]} input
     get-qty-max-date (-> (:rdd @scope-rdd)
                       (f/map #(if-not (or (s/blank? (get % qty-col)) (not (pos? (read-string (get % qty-col)))))
                                 (get % col) false))
                       (f/reduce #(if (pos? (compare % %2)) %1 %2)))]
(when-not (pos? (compare (get row col) get-qty-max-date)) row)))

此处rowvector。我遇到的挑战是get-qty-max-date属于RDD类型。如何以when-not形式进行比较?

注意:我们的想法是将future-rows函数用作谓词

鉴于RDD:

[[" " "2009/12/02"] ["4" "2005/02/08"] ["0" "2014/12/02"] ["5" "2005/08/01"] ["2" "2007/09/02"]]

future-rows用作谓词时,所需的输出为:

[["4" "2005/02/08"] ["5" "2005/08/01"] ["2" "2007/09/02"]]

其中输入为input { :col 1 :qty-col 0 }以用于上述功能 确定的最大日期为2007/09/02。因此,从数据集中删除了更大的日期2009/12/022014/12/02

如果还有其他方法可以做到这一点,我将不胜感激。

所以说我们有一个执行此功能的主要功能

(defn remove-rows [xctx input]
  (f/filter (:rdd xctx) #(future-rows row { :col 1 :qty-col 0 }))

将产生所需的输出

谢谢!

1 个答案:

答案 0 :(得分:1)

I guess you're looking for something like this:

(defn not-empty-and-positive?
  [qty-col]
  (f/fn
   [row]
   (let [x (get row qty-col)]
     (not (or (s/blank? x) (neg? (read-string x)))))))


(defn get-max-date
  [col qty-col]
    (-> (:rdd @scope-rdd)
        (f/filter (not-empty-and-positive? qty-col))
        (f/map (f/fn [row] (get row col)))
        (.top 1)
        (first)))


(defn is-past?
    [col qty-col]
    (let [max-date (get-max-date col qty-col)]
      (f/fn [row] (neg? (compare (get row col) max-date)))))


(let [{:keys [ col qty-col ]} input
      not-empty-and-positive? (not-empty-and-positive? qty-col)
      is-past? (is-past? col qty-col)]
  (-> (f/filter rdd not-empty-and-positive?) (f/filter is-past? ) (f/collect)))