我有一个存储在 s3 上的同现计数表(其中每一行都是 [key-a, key-b, count]),我想从中生成同现概率矩阵。
为此,我需要计算每个键 a 的计数总和,然后将每行除以其键 a 的总和。
如果我“手动”执行此操作,我会传递数据以生成从键到总计的哈希表(在 leveldb 或类似的东西中),然后第二次传递数据以执行分配。这听起来不像是一种非常流氓的方式。
有什么方法可以通过执行相当于自连接的操作来获取一行的总计吗?
最佳答案
示例数据:
(def coocurrences
[["foo" "bar" 3]
["bar" "foo" 3]
["foo" "quux" 6]
["quux" "foo" 6]
["bar" "quux" 2]
["quux" "bar" 2]])
查询:
(require '[cascalog.api :refer :all] '[cascalog.ops :as c])
(let [total (<- [?key-a ?sum]
(coocurrences ?key-a _ ?c)
(c/sum ?c :> ?sum))]
(?<- (stdout) [?key-a ?key-b ?prob]
(div ?c ?sum :> ?prob)
(coocurrences ?key-a ?key-b ?c)
(total ?key-a ?sum)))
输出:
RESULTS
-----------------------
bar foo 0.6
bar quux 0.4
foo bar 0.3333333333333333
foo quux 0.6666666666666666
quux foo 0.75
quux bar 0.25
-----------------------
关于hadoop - 使用 cascalog 将同现计数转化为同现概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628870/