Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 跨所有行的Cassandra Cascalog操作_Clojure_Mapreduce_Cassandra_Cascading - Fatal编程技术网

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代码填充较小的数据集(我通常会使用一些记录):