gpt4 book ai didi

java - 如何使用 Astyanax 查询多个复合列前缀?

转载 作者:行者123 更新时间:2023-11-30 11:27:33 26 4
gpt4 key购买 nike

Astyanax 通过其 AnnotatedCompositeSerializer 支持 Cassandra 中的复合列。我有一个包含 3 个字段的复合列名称的列族,类似于此示例,改编自 Astyanax's documentation (这些列实际上不是 sessionIdtoken,假装它们是为了论证):

// Annotated composite class
public class SessionEvent {
@Component(ordinal=0) UUID sessionId;
@Component(ordinal=1) UUID token;
@Component(ordinal=2) UUID timestamp;

public SessionEvent() { }
}

static AnnotatedCompositeSerializer<SessionEvent> eventSerializer
= new AnnotatedCompositeSerializer<>(SessionEvent.class);
static ColumnFamily<String, SessionEvent> CF_SESSION_EVENTS
= new ColumnFamily<>("SessionEvents",
StringSerializer.get(), eventSerializer);

// Querying cassandra for a column slice on one prefix, but we want two!
OperationResult<ColumnList<SessionEvent>> result = keyspace.prepareQuery(CF_SESSION_EVENTS)
.getKey("UserId1")
.withColumnRange(eventSerializer.buildRange()
.withPrefix("SessionId1")
.build())
.execute();

问题是:我想查询前缀中有两个复合列(在本例中为 sessionIdtoken)的所有列,而不仅仅是一个,并且对于所有时间戳,而不仅仅是在一个范围内。这对于 CQL3 来说显然是可能的,也很容易做到,但我卡在 Cassandra 1.0.x 上,找不到 Astyanax 接受的方式(通过调用 withPrefix(UUID) 两次或传递它是一个复合数据结构)。

有什么方法可以用 Astyanax 做到这一点吗?我能以某种方式使用基本的 RangeBuilder 并手动序列化开始和结束吗?

最佳答案

Cassandra 中的列是按顺序存储的。在您的示例中,sessionId 最重要,其次是 token ,时间戳最不重要。换句话说,列按 sessionId 排序,然后是 token ,然后是时间戳。

如果我理解正确,您正在尝试查询具有指定 sessionId 的列以及 token 和任何时间。由于上述原因,具有匹配的 sessionId 和 token 的列是连续存储的。您可以按以下方式使用最小/最大日期查询任何日期:

startTime = new Date(0);
endTime = new Date(Long.MAX_VALUE);

SessionEvent from = new SessionEvent(sessionId, token, startTime);
SessionEvent to = new SessionEvent(sessionId, token, endTime);

RangeBuilder rb = new RangeBuilder().setStart(from).setEnd(to);

OperationResult<ColumnList<SessionEvent>> result = keyspace
.prepareQuery(CF_SESSION_EVENTS)
.getKey("UserId1")
.withColumnRange(rb.build())
.execute();

关于java - 如何使用 Astyanax 查询多个复合列前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276457/

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