2

我正在尝试将 sstableloader 用于使用 CQL 3.0 创建的表我已经使用 CQL 3 在 Cassandra 中创建了一个表,如下所示:

CREATE TABLE users1 (
  id text PRIMARY KEY,
  firstname text,
  lastname text, 
) WITH
compaction={'class': 'SizeTieredCompactionStrategy'} AND
 compression={'sstable_compression': 'SnappyCompressor'};

我使用 SSTableSimpleUnsortedWriter 创建 sstables,如下所示:

IPartitioner partitioner = new Murmur3Partitioner();
SSTableSimpleUnsortedWriter usersWriter = new SSTableSimpleUnsortedWriter(  
        directory, partitioner,keyspace,"users1",AsciiType.instance, null,64);
    long timestamp = System.currentTimeMillis() * 1000;
    ByteBuffer id = bytes("a11");
    usersWriter.newRow(id);
    usersWriter.addColumn(bytes("firstname"), bytes("Ticho"), timestamp);
    usersWriter.addColumn(bytes("lastname"), bytes("Richie"), timestamp);
    usersWriter.close();
    System.exit(0);

虽然生成了 sstables 并且我成功地将 sstables 加载到 EC2 中的 4 节点集群中。但我无法查询它们。它只是等待并最终给出一个 RPC 超时错误。我可以使用 CLI 创建的 columnfamily 成功上传和查询,如Datastax Developer Blog所示。

请告诉我如何正确使用 SSTableSimpleUnsortedWriter 与 CQL....

我的最终目标是在 CQL(复制 SQL 表)中创建一个具有复合键的列族,并使用 SSTableLoader 从一个非常大的 csv 导出文件上传数据。

4

2 回答 2

1

这是您的 cf 的 cli DESCRIBE 输出:

Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Default column value validator: org.apache.cassandra.db.marshal.BytesType
Columns sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type)

你至少有三个问题:

  • 您使用 AsciiType 而不是 UTF8Type 作为分区键验证器。您无需对 ByteBufferUtil.bytes(String) 调用执行任何操作,因为它们编码为 UTF8。
  • CQL 中的列名始终是复合类型,因此(只要您不使用集合)您需要使用 db.marshal.CompositeType 构建列名,其中复合列表中的最后一个类型是 UTF8。
  • 查看您的表的 cli LIST 输出,它包含一个带有空白名称和值的列,您需要添加这些列,例如:

    RowKey: 123 => (column=, value=, timestamp=1376298826474000) => (column=firstname, value=416c6578, timestamp=1376298826474000) => (column=lastname, value=4861736c656875727374, timestamp=13762988264700)

于 2013-08-12T08:47:35.430 回答
0

或者,您可以批量加载到与旧列族格式向后兼容的“静态列”表中:

CREATE TABLE users1 (
  id text PRIMARY KEY,
  firstname text,
  lastname text, 
) WITH COMPACT STORAGE;

SSTableLoader 示例应该使用旧式的 pre-CQL 格式。

于 2013-11-25T13:50:16.500 回答