Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure中的外连接_Clojure_Outer Join - Fatal编程技术网

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库中的地图集合执行外部联接(左、右和全)的功能

我想这可以通过修改
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(著名)的联接类型如下:

  • 内连接
  • 左外连接
  • 右外连接
  • 完全外接
  • 自然连接
  • 交叉连接
它已经有一段时间没有更新了,但可以在1.3、1.4和1.5中使用。要使其在没有任何外部依赖的情况下工作,请执行以下操作:

  • 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”,可以解决堆栈溢出问题。