Clojure 跨所有行的Cassandra Cascalog操作
我有这样的数据Clojure 跨所有行的Cassandra Cascalog操作,clojure,mapreduce,cassandra,cascading,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.008084167000000
{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}}]
...}
所以我试图弄清楚ClojureWorks Cassandra级联tap是否已经支持所有行的操作。如您所见,超级行键、超级行和超级列都是生成的(UUID、日期、时间戳等)。在我看到的示例和代码中,我认为需要提前指定用于标识列名、列字段名、键列名和字段映射的固定名称
在Cassandra支持MapReduce的Hadoop级别上,Cassandra似乎确实支持从给定的列族中获取所有数据行。从文件中:
“Cassandra行或行片段(即,成对的键+SortedMap
列)是映射任务以供作业处理的输入,如下所示
由描述要获取哪些列的SlicePredicate指定
从每一排开始。”
因此,在较低的级别上,这似乎是完全可能的,但不清楚如何在级联级别上完成我正在尝试的工作
这是否需要调整或创建现有tap的变体,或者可以通过现有tap的某种方式实现?我假设Robert提到: 我试图让pingles/cascading.cassandra使用Cascadalog,但没有成功,所有依赖项都必须更改,因此所有接口都必须更改。所以我决定写我自己的东西(并不总是最好的主意) 现在,回答如下: 我花了比预期更长的时间来理解如何准确回答你,但我带来了好消息:) 首先,我不打算在tap中包含宽行支持,但事实证明,即使在当前版本中,它也可以工作。不幸的是,我还不能举出例子,因为卡萨福特(https://github.com/clojurewerkz/cassaforte,我们使用的cassandra驱动程序依赖于Clojure 1.4,因为有一个带有原始类型提示的错误:如果我没有弄错的话,Midje有硬版本集,所以它不支持1.4,所以我不得不使用我们自己的驱动程序的过时版本) 不包括宽行的原因是cassandra团队自己不鼓励使用它们,并建议改用复合列,因为它们可以以更好的方式读取,并且不需要为了获取部分数据而获取整个超级列。我意识到这并不总是容易的,尤其是如果有一个应用程序是很久以前写的 接下来, 你说得对,现在你应该指定名字。不知何故,我没有预见到生成的列名 为了获取所有列,必须使用SlicePredicate,并指定空字节缓冲区以及传递给它的SliceRange的slicestart和slicefinish。所以你可以设置 SliceRange(.setSlice_range)而不是(.setColumn_name),这完全是一样的,如果您决定坚持使用,您可以在CasssandraScheme.java中进行更改 我们的水龙头。我要做的是,当没有指定列名时,我们只获取所有列名 另一个需要进行的更改是值的反序列化。也许在这里,你对如何处理宽行有更好的感觉。本质上,您会得到如下响应: Key/{java.nio.HeapByteBuffer[pos=65 lim=70cap=93]=org.apache.cassandra.db。Column@478bb374} 因此,格式将基本相同。在这里,您只需反序列化键并将列转换为元组。如果列中的键值对数量不同,则 用空值填充(可能),否则可能很难理解/调试 同样,如果您决定不使用tap,您必须升级到Cassaforte beta10 snapshot(至少对于初始测试),从project.clj中删除midje并注释掉所有内容 与此相关 如果您愿意,可以使用cassaforte代码填充较小的数据集(我通常会使用一些记录):