Clojure中的外连接
与这个问题类似: 是否有对任何Clojure库中的地图集合执行外部联接(左、右和全)的功能 我想这可以通过修改Clojure中的外连接,clojure,outer-join,Clojure,Outer Join,与这个问题类似: 是否有对任何Clojure库中的地图集合执行外部联接(左、右和全)的功能 我想这可以通过修改clojure.set/join的代码来实现,但这似乎是一个足够常见的要求,因此值得检查它是否已经存在 大概是这样的: (def s1 #{{:a 1, :b 2, :c 3} {:a 2, :b 2}}) (def s2 #{{:a 2, :b 3, :c 5} {:a 3, :b 8}}) ;=> (full-join s1 s2
clojure.set/join
的代码来实现,但这似乎是一个足够常见的要求,因此值得检查它是否已经存在
大概是这样的:
(def s1 #{{:a 1, :b 2, :c 3}
{:a 2, :b 2}})
(def s2 #{{:a 2, :b 3, :c 5}
{:a 3, :b 8}})
;=> (full-join s1 s2 {:a :a})
;
; #{{:a 1, :b 2, :c 3}
; {:a 2, :b 3, :c 5}
; {:a 3, :b 8}}
以及左右外部联接的适当功能,即包括在左侧、右侧或两侧联接键没有值(或nil
value)的条目。Sean Devlin(著名)的联接类型如下:
- 内连接
- 左外连接
- 右外连接
- 完全外接
- 自然连接
- 交叉连接
- 将
替换为fn元组
juxt
- 将ns声明中的整个
子句替换为(:use)
(require[clojure.set:refere[crossion union]])
- 从下面添加功能映射VAL:
(defn map-vals
[f coll]
(into {} (map (fn [[k v]] {k (f v)}) coll)))
或Clojure 1.5及以上版本
(defn map-vals
[f coll]
(reduce-kv (fn [acc k v] (assoc acc k (f v))) {} coll))
该库的用途是连接类型、两个集合(两组类似于上面示例的映射或两个sql结果集)和至少一个连接fn。由于关键字是映射上的函数,通常只有连接键才足够:
=> (full-outer-join s1 s2 :a :a)
({:a 1, :c 3, :b 2}
{:a 2, :c 5, :b 3}
{:b 8, :a 3})
如果我没记错的话,肖恩前一段时间曾试图将表格UTIL输入contrib,但从未成功过。可惜它没有自己的项目(在github/clojars上)。Stackoverflow或Clojure Google group上不时会出现这样一个库的问题
另一个选项可能是使用datomic中的数据日志库来查询clojure数据结构。斯图亚特·哈洛威在他的GIST中有一个名字 虽然我最初不愿意复制和粘贴代码,但这就是我最终解决问题的方法。谢谢我也有同样的犹豫,但有SQL背景,这些抽象自然就出现了,所以最后我屈服了。也许我会花点时间自己编写这样一个库,并将它推到Clojars上,但我对github和开源的东西不太熟悉。我尝试了Clojure 1.6,在上面建议的修复之后,它对上面的示例有效,但我有两个表的堆栈溢出错误,每个表大约有4000行。下面是错误:“java.lang.StackOverflowerError:null”。我已经将我的项目设置为:jvmopts[“-Xmx1024m”]请建议任何简单的修复或替代方案。谢谢在源代码中的join-worker实现中,通过将“reduce-concat”替换为“apply-concat”,可以解决堆栈溢出问题。