1

我正在使用 Erlang 与 Cassandra 交互,但我无法让 get_slice 命令返回一行中所有列的列表。我用:

    X = thrift_client:call( C,
           'get_slice',
           [ "Keyspace1",
             K,
             #columnParent{column_family="KeyValue"},
             #slicePredicate{},
             1
             ] ),

:但我回来了:

invalidRequestException,<<"predicate column_names and slice_range may not both be null">>

:但是,使用 cassandra-cli 界面可以正常工作。有任何想法吗?

更新:

我修改了 Erlang 示例以反映给定的 Java 示例:

get_props(K) -> {ok, C} = thrift_client:start_link("127.0.0.1",9160, cassandra_thrift),

        S = #sliceRange{start="",finish="",reversed=false,count=100},
        X = thrift_client:call( C,
               'get_slice',
               [ "Keyspace1",
                 K,
                 #columnParent{column_family="KeyValue"},
                 #slicePredicate{slice_range=S},
                 1
                 ] ),
        X.

: 现在可以了。注意添加的行:

S = #sliceRange{start="",finish="",reversed=false,count=100}

4

1 回答 1

1

您默认初始化 SlicePredicate 对象。这将默认构造一个 SlicePredicate,其 reversed 设置为 false(与 SQL 语法比较:“ORDER by DESC”),count 设置为 100(与 SQL 语法比较:LIMIT 100),并且 slice_range 和 column_names 都设置为 null(在 Erlang 中未指定,因为 null 的“缺乏”)。

希望我的 Java 代码片段可以帮助您(示例获取所有列)。我想强调 SlicePredicate 的创建和使用。

private static void get_slice(Cassandra.Client client, String keyspace,
            byte[] userI1, ColumnParent parent)  {

        SlicePredicate predicate = new SlicePredicate();
        SliceRange sliceRange = new SliceRange();
        sliceRange.setStart(new byte[0]);
        sliceRange.setFinish(new byte[0]);

        predicate.setSlice_range(sliceRange);

        List<ColumnOrSuperColumn> results =
            client.get_slice(   
                keyspace, 
                userI1, 
                parent, 
                predicate, 
                ConsistencyLevel.ONE
        );

        for (ColumnOrSuperColumn cosc : results) {
            System.out.println("column name:      " + new String(cosc.column.name));
            System.out.println("column value:     " + new String(cosc.column.value));
            System.out.println("column timestamp: " + cosc.column.timestamp);
        }
    }
于 2010-04-25T14:45:21.713 回答