trident storm cassandra,用多个主键写入表

lfapxunr  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(406)

我正在学习如何使用风暴的三叉戟与Cassandra2.0.5,风暴版本0.9.0.1。我还使用com.hmsonline storm cassandra 0.4.0-rc4 contrib。
我的目标是简单地将一些文本行插入到具有id(int)、name(text)和句子(text)列的表中。id和name是主键。
这个 partitionPersist 需要 StateUpdater ,为此我使用 com.hmsonline.storm.cassandra.trident.CassandraUpdater<K, C, V> . 但从它看起来只有一个键作为输入,而不是两个(我需要id和name)。元组Map器( TridentTupleMapper )也使用一个键:

TridentTupleMapper<K, C, V> tupleMapper

也许我遗漏了一些东西,但是如何将多个列定义为键呢?

t1rydlwq

t1rydlwq1#

让我给你介绍一下我和布莱恩一直在做的一个项目,这个项目利用了Cassandra和斯托姆:https://github.com/hmsonline/storm-cassandra-cql
您可以通过几个示例来了解如何开发适合键/列Map的cqltuplemapper。代码仍在开发中,但cql3有一个合适的back-map实现,它既可以持久化聚合,也可以存储分区持久化。
为了满足您的需要,您需要定义一个三叉戟拓扑,该拓扑通过以下方法对传入的数据(句子)进行分组:

inputStream.groupBy(new Field("sentences"))

然后,您将实现一个cqltuplemapper——特别是Map(k key,v value),该Map将具有一个定制的cql insert语句,该语句将键Map到其传递的值。您的查询类似于:

@Override
public Statement map(List<String> keys, String value) {
    Insert statement = QueryBuilder.insertInto(KEYSPACE_NAME, TABLE_NAME);
    statement.value("id", keys.get(0));
    statement.value("name", keys.get(1));
    statement.value("sentence", value);
    return statement;
}

我希望这有帮助。

相关问题