gpt4 book ai didi

clojure - 跨所有行的 Cassandra Cascalog 操作

转载 作者:行者123 更新时间:2023-12-04 05:23:26 27 4
gpt4 key购买 nike

我有看起来像这样的数据

  {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 是否已经支持所有行的操作。如您所见, super 行键、 super 行和 super 列都已生成(uuid、日期、时间戳等)。在我看到的示例和代码中,我被引导相信需要预先指定标识列名、列字段名、键列名和字段映射的固定名称。

在 Cassandra 支持 MapReduce 的 Hadoop 级别上,Cassandra 似乎确实支持从给定的列族中获取所有数据行。从文档中:

"Cassandra rows or row fragments (that is, pairs of key + SortedMap of columns) are input to Map tasks for processing by your job, as specified by a SlicePredicate that describes which columns to fetch from each row."



所以看起来在低级别肯定是可能的,但目前还不清楚如何完成我在级联级别上尝试做的事情。

这是否需要调整或创建现有水龙头的变体,或者可以用现有水龙头以某种方式完成?

最佳答案

我假设罗伯特指的是:https://github.com/ifesdjeen/cascading-cassandra

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

现在,回答:

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

首先,我不打算在水龙头中加入宽行支持,但事实证明它即使在当前版本中也能正常工作。不幸的是,我还不能推送示例,因为 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 中进行更改如果你决定坚持
我们的水龙头。我要做的是,当没有指定列名时,我们只需获取所有列名。

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

键/{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

关于clojure - 跨所有行的 Cassandra Cascalog 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13463693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com