所有行的Cassandra Cascalog操作

时间:2012-11-19 22:43:51

标签: clojure mapreduce cassandra cascading

我的数据看起来像这样

  {super-row-key1 [{ts1 {version-ts1 value, version-ts2 value}}
                   {ts2 {version-ts1 value}}]
   super-row-key2 ...}

这些键和值类似于

{"4447c9a6-9912-44d7-a6b5-cef40735f92c:2011-06"
 [{1291180500000 {1351709255098 -0.008084167000000001}}
  {1291184100000 {1351709255098 -0.004395833}}
  {1291185000000 {1351709255098 -0.003075}}]
 ...}

所以我想弄清楚ClojureWerks Cassandra Cascading tap是否已支持所有行的操作。如您所见,超行键,超行和超级列都是生成的(uuids,日期,时间戳等)。在我看到的示例和代码中,我被认为需要事先指定标识列名,列字段名,键列名和字段映射的固定名称。

在Cassandra对MapReduce的支持的Hadoop级别,看起来Cassandra确实支持从给定的列族中获取所有数据行。来自文档:

  

“Cassandra行或行片段(即成对的键+ SortedMap)   列)输入到Map任务以供您的作业处理,如   由SlicePredicate指定,描述要获取的列   从每一行开始。“

所以看来它肯定可能处于低水平,但目前还不清楚如何完成我在Cascading级别尝试做的事情。

这是否需要调整或创建现有点击的变体,还是可以使用现有点击以某种方式完成?

1 个答案:

答案 0 :(得分:3)

我认为罗伯特提到:https://github.com/ifesdjeen/cascading-cassandra

我试图让ping / cascading.cassandra与Cascalog一起工作,但没有成功,所有依赖,因此必须更改所有接口。所以我决定写自己的东西(并不总是最好的主意)。

现在,回答:

我花了比预期更长的时间来理解如何回答你,但我带来了好消息:)

首先,我没有计划在水龙头中包含广泛的行支持,但事实证明它甚至在当前版本中也能正常工作。不幸的是,我还不能推出示例,因为Cassaforte(https://github.com/clojurewerkz/cassaforte,我们使用的cassandra驱动程序依赖于Clojure 1.4,因为原始类型提示的错误:http://dev.clojure.org/jira/browse/CLJ-852如果我没有弄错,并且Midje有硬版本设置,那么它不支持1.4,所以我不得不使用我们自己的驱动程序的过时版本。)

不包括宽行的原因是cassandra团队自己不鼓励使用它们,建议使用复合列,因为它们可以更好地读取,并且不需要获取整个超级列以获取部分数据。我意识到这并不总是那么容易,特别是如果有很久以前写过的应用程序。

接下来,

你是对的,现在你应该指定名字。我以某种方式没有预见到生成的列名。

为了获取所有列,您必须使用SlicePredicate,并指定空字节缓冲区以及传入其中的SliceRange的切片开始和切片完成。所以你可以设置 SliceRange(.setSlice_range)代替(.setColumn_names),它将完全相同,如果您决定坚持使用,可以在CasssandraScheme.java https://github.com/ifesdjeen/cascading-cassandra/blob/master/src/main/java/com/clojurewerkz/cascading/cassandra/CassandraScheme.java#L247中进行更改 我们的水龙头我要做的是,如果没有指定列名,我们只需要获取所有列名。

需要进行的另一项改变是对值进行反序列化。可能在这里你对如何处理宽行感觉更好。从本质上讲,您会得到如下响应:

Key / {java.nio.HeapByteBuffer [pos = 65 lim = 70cap = 93] =org.apache.cassandra.db.Column@478bb374}

所以格式几乎是一样的。在这里,您只需要反序列化键并将列转换为元组。如果列中键值对的数量变化,您将拥有 用空值填充(可能),否则可能很难理解/调试。

再次,如果您决定不使用,您必须升级到Cassaforte beta10快照,(至少在初始测试中)从project.clj中移除midje并注释掉所有内容 与之相关。

如果您愿意,可以使用cassaforte代码填充较小的数据集(我通常会使用几条记录):https://github.com/clojurewerkz/cassaforte/blob/master/test/clojurewerkz/cassaforte/thrift/core_test.clj#L26