给定一个函数来过滤掉大于从给定数据集(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)))
此处row
是vector
。我遇到的挑战是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/02
和2014/12/02
。
如果还有其他方法可以做到这一点,我将不胜感激。
所以说我们有一个执行此功能的主要功能
(defn remove-rows [xctx input]
(f/filter (:rdd xctx) #(future-rows row { :col 1 :qty-col 0 }))
将产生所需的输出
谢谢!
答案 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)))