有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Cassandra中使用hector客户端的组合键的第一个组件获取行

我在rowkey中使用复合数据类型,列族如下

create column family CompositeTest
with comparator = 'UTF8Type'
and key_validation_class = 'CompositeType(UTF8Type,UTF8Type)'
and default_validation_class = 'UTF8Type';

此柱族的示例数据如下所示

RowKey: s2:2222222
=> (column=param1, value=value1
=> (column=param2, value=value2
=> (column=param3, value=value3
-------------------
RowKey: s2:3333333
=> (column=param1, value=value1
=> (column=param2, value=value2
=> (column=param3, value=value3
-------------------
RowKey: s2:1111111
=> (column=param1, value=value1
=> (column=param2, value=value2
=> (column=param3, value=value3
-------------------
RowKey: s1:3333333
=> (column=param1, value=value1
=> (column=param2, value=value2
=> (column=param3, value=value3
-------------------
RowKey: s1:2222222
=> (column=param1, value=value1
=> (column=param2, value=value2
=> (column=param3, value=value3
-------------------
RowKey: s1:1111111
=> (column=param1, value=value1
=> (column=param2, value=value2
=> (column=param3, value=value3

我想得到所有行,其中行键的第一个组件是“s1”。是否可以使用Hector客户端?如果不是,那么卡桑德拉的客户可能是哪家

我尝试过使用以下代码,但它不起作用

Composite start = new Composite();
        start.addComponent(0, "s1", ComponentEquality.EQUAL);

        Composite end = new Composite();
        end.addComponent(0, "s1", ComponentEquality.GREATER_THAN_EQUAL);

        RangeSlicesQuery<Composite, String, String> rangeSlicesQuery = HFactory.createRangeSlicesQuery(keyspace, new CompositeSerializer(), StringSerializer.get(),  StringSerializer.get()); 
        rangeSlicesQuery.setKeys(start, end);
        rangeSlicesQuery.setRange("param1", "param3", false, 100);
        rangeSlicesQuery.setColumnFamily("CompositeTest");
        rangeSlicesQuery.setRowCount(11);
        QueryResult<OrderedRows<Composite, String, String>>  queryResult = rangeSlicesQuery.execute();

        Rows<Composite, String, String> rows = queryResult.get();
        Iterator<Row<Composite, String, String>> rowsIterator = rows.iterator();

先谢谢你


共 (2) 个答案

  1. # 1 楼答案

    这在Cassandra中不可能使用任何客户端。在您(应用程序开发人员)看来,行键是一个复合对象,而在Cassandra本身中,行键是一个单字节数组,作为单个原子值存储在Cassandra的SSTable中

    意思是,您只能查询包含整个键的行,而不仅仅是键的一部分。否则,您必须扫描整个column系列,直到找到匹配项——这将非常昂贵

    也就是说,如果您确实需要能够仅使用列族中的部分行键来查询这些行,那么我强烈建议为这些键部分创建单独的索引列族。这将允许您使用标准键/列查找来查找原始数据列族中符合条件的所有行

  2. # 2 楼答案

    问题是您正在尝试对行键执行切片。 如果您在Cassandra中使用的是随机分区器(例如随机分区器或杂音3分区器),则根本不可能。如果您使用的是保序分区器,这是可能的(但我从未尝试过)。在你的情况下,你应该是一个不存在不幸的复合者,因此你应该自己写。然后,您还应该通过根据您的数据计算正确的令牌来配置集群。 正如你所看到的,这不是最简单的方法

    但是,如果您只是将复合值放在列名中而不是键中,您也可以这样做。 您可以通过以下方式定义CF:

    create column family CompositeTest
       with comparator = 'CompositeType(UTF8Type,UTF8Type)'
       and key_validation_class = 'UTF8Type'
       and default_validation_class = 'UTF8Type';
    

    并按如下方式存储数据:

    RowKey: s2
    => (column=2222222:param1, value=value1
    => (column=2222222:param2, value=value2
    => (column=2222222:param3, value=value3
    => (column=3333333:param1, value=value1
    => (column=3333333:param2, value=value2
    => (column=3333333:param3, value=value3
    => (column=1111111:param1, value=value1
    => (column=1111111:param2, value=value2
    => (column=1111111:param3, value=value3
             -
    RowKey: s1:
    => (column=3333333:param1, value=value1
    => (column=3333333:param2, value=value2
    => (column=3333333:param3, value=value3
    => (column=2222222:param1, value=value1
    => (column=2222222:param2, value=value2
    => (column=2222222:param3, value=value3
    => (column=1111111:param1, value=value1
    => (column=1111111:param2, value=value2
    => (column=1111111:param3, value=value3
    

    使用这种结构,您认为查询非常简单,然后您可以始终在列名上切片,以仅选择所需间隔内的列