为左外连接提供默认值

时间:2013-09-23 16:24:30

标签: clojure cascading cascalog

我想知道在cascalog中为外部连接指定默认值的最佳方法是什么,该字段可以为null。

 (def example-query
    (<- [?id ?fname ?lname !days-active]
        (users :> ?id ?fname ?lname)
        (active :> ?fname ?lname !days-active))

在此示例中,用户和活动将是先前定义的查询,我只是想关联活动用户信息(?fname?lname!days-active)和常规用户信息(?id?fname?lname)

因此,当连接发生时,如果没有相应的!days-active信息,则输出0而不是nil 即。

392393 john smith 3
003030 jane doe 0

而不是

392393 john smith 3
003030 jane doe null

更新了示例

(<- [!!database-id ?feature !!user-clicks !!engaged-users ?application-id ?active-users]
                     (app-id-db-id-feature-clicks-engaged :> ?application-id !!database-id ?feature !!user-clicks !!engaged-users )
                     (user-info :> ?application-id ?feature ?active-users))]

示例输出看起来大致像

4234 search null null 222 5000
3232 profile 500 400 331 6000

通过我感兴趣的过滤我可以更改将参与的字段!!用户和!!用户点击有0而不是null。使用多个谓词会有效吗?

1 个答案:

答案 0 :(得分:1)

我认为您要做的是添加or谓词:

(def example-query
   (<- [?id ?fname ?lname !days-active]
       (users :> ?id ?fname ?lname)
       (active :> ?fname ?lname !days-active)
       (or !days-active 0 :> ?active-days)))

顺便说一下,这不是外部联接,它只是不会过滤掉!days-active位置的空变量。