首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转移/转行到卡斯卡洛格的列上?

转移/转行到卡斯卡洛格的列上?
EN

Stack Overflow用户
提问于 2014-04-28 13:51:15
回答 1查看 185关注 0票数 1

假设我有一组元组要由Cascalog处理,格式类似于[Date, Name, Value]

代码语言:javascript
复制
2014-01-01 Pizza        3
2014-01-01 Hamburger    4
2014-01-01 Cheeseburger 2
2014-01-02 Pizza        1
2014-01-02 Hamburger    2

考虑到我有一个像[Pizza, Hamburger, Cheeseburger]这样的列的列表,我想转换/枢轴数据,如下所示:

代码语言:javascript
复制
Date       Pizza Hamburger Cheeseburger
2014-01-01 3     4         2
2014-01-02 1     2         0

在卡斯卡洛格做这件事最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-29 08:03:04

有一种方法可以做到:

代码语言:javascript
复制
(:use cascalog.api)

(def input
  [["2014-01-01" "Pizza"        3]
   ["2014-01-01" "Hamburger"    4]
   ["2014-01-01" "Cheeseburger" 2]
   ["2014-01-02" "Pizza"        1]
   ["2014-01-02" "Hamburger"    2]])

(defn init-aggregate [k v]
  {k v})

(def combine-aggregate
  (partial merge-with +))

(defparallelagg aggregate
  :init-var #'init-aggregate
  :combine-var #'combine-aggregate) 

(defn select-values [hashmap keyseq]
  (map #(get hashmap %) keyseq))

(def columns
  ["Pizza" "Hamburger" "Cheeseburger"])

(defn transpose [data]
  (<- [?date !pizza !hamburger !cheeseburger]
      ((<- [?date ?sum]
           (data ?date ?name ?value)
           (aggregate ?name ?value :> ?sum))
         ?date ?sum)
      (select-values ?sum columns :> !pizza !hamburger !cheeseburger)))

(?- (stdout) (transpose input))

让我们快速浏览一下代码:

大多数操作发生在transpose函数中,它包含两个查询:

  1. 内部查询将给定日期的所有?name ?value对聚合到?sum映射中。
  2. 外部查询使用select-values?sum映射中获取列的值,并进入最终的结果行。

因为我们知道列是Pizza, Hamburger, Cheeseburger,所以我们可以简单地将它们硬编码到查询中。如果您想知道如何使列动态,请阅读Nathan在在Cascalog创建一个新闻提要上的博客文章。

注意,我们必须将列表示为可空变量(使用!),因为不是每个列都有给定行的值。如果要避免null结果,可以将select-values更改为使用0作为默认值。

(一个警告是,这不会在最后的输出中产生任何头,因此必须作为后处理步骤来完成。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23342939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档