【问题标题】:Insert into column family using Datastax java driver?使用 Datastax java 驱动程序插入列族?
【发布时间】:2013-10-19 04:35:47
【问题描述】:

如果我像之前使用基于 Thrift 的客户端一样在 Cassandra 中创建了这样的列族..

create column family USER
with comparator = 'UTF8Type'
and key_validation_class = 'UTF8Type'
and default_validation_class = 'BytesType'

那么我可以使用具有异步/批量写入功能的 Datastax Java 驱动程序插入上述列族吗?

我将使用 INSERT 语句插入到上面的列族中吗?是否可以使用 Datastax Java 驱动程序?

我的印象是,我只能使用 Datastax Java 驱动程序插入基于 CQL 的表中,而不是列族设计表中...

【问题讨论】:

    标签: java cassandra datastax-java-driver


    【解决方案1】:

    TL;DR
    有点,但最好创建一个基于 cql3 的表并从那里继续。

    首先要清楚地了解发生了什么,请使用 cqlsh 中的 describe 命令:

    cqlsh> describe COLUMNFAMILY "USER";
    
    CREATE TABLE "USER" (
      key text,
      column1 text,
      value blob,
      PRIMARY KEY (key, column1)
    ) WITH COMPACT STORAGE AND
      bloom_filter_fp_chance=0.010000 AND
      caching='KEYS_ONLY' AND
      comment='' AND
      dclocal_read_repair_chance=0.000000 AND
      gc_grace_seconds=864000 AND
      index_interval=128 AND
      read_repair_chance=0.100000 AND
      replicate_on_write='true' AND
      populate_io_cache_on_flush='false' AND
      default_time_to_live=0 AND
      speculative_retry='NONE' AND
      memtable_flush_period_in_ms=0 AND
      compaction={'class': 'SizeTieredCompactionStrategy'} AND
      compression={'sstable_compression': 'LZ4Compressor'};
    

    然后您可以使用 cqlh 构建插入语句(我使用 cqlsh):

    cqlsh:test> insert into test."USER" (key, column1, value) VALUES ('epickey', 'epic column 1 text', null);
    

    但是,如果您进行选择...

    cqlsh:test> SELECT * FROM test."USER" ;
    
    (0 rows)
    

    完成后返回 CLI:

    [default@unknown] use test;
    Authenticated to keyspace: test
    [default@test] list USER;
    Using default limit of 100
    Using default cell limit of 100
    -------------------
    RowKey: epickey
    
    1 Row Returned.
    Elapsed time: 260 msec(s).
    

    我将使用的最后一个工具是 sstable2json(从 sstable 中获取所有数据,然后...将其转换为 json 表示形式)

    对于上面的 USER cf 的单个插入,我得到了这个:

    [
    {"key": "657069636b6579","columns": [["epic column 1 text","5257c34b",1381483339315000,"d"]]}
    ]
    

    所以数据就在那里,但你真的无法通过 cql 访问它。

    注意这一切都是使用 C* 2.0 和 cqlsh 4.0 (cql3) 完成的

    【讨论】:

      【解决方案2】:

      是的,使用以下代码:

      String query = "INSERT INTO " + keyspace_name + "." + column_family + " (" + column_names + ") VALUES (" + column_values + ");";
      statement = session.prepare(query);
      boundStatement = new BoundStatement(statement);
      
      boundStatement.setString(0, key);
      boundStatement.setString(1, subColNames[k]);
      boundStatement.setMap(2, colValues);
      session.execute(boundStatement);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-18
        • 2016-01-22
        • 1970-01-01
        • 2016-05-30
        • 2015-11-01
        • 1970-01-01
        • 2016-11-29
        • 2016-11-29
        相关资源
        最近更新 更多