【问题标题】:How data is stored in cassandra composite key Column Family数据如何存储在 cassandra 复合键列族中
【发布时间】:2014-09-19 16:44:54
【问题描述】:

我在 DSE 3.2.4 中遇到了一些特殊问题, 这是我的表结构,

CREATE TABLE tbl_samp (
  PK text,
  CK1 varint,
  CK2 text,
  CK3 varint,
  value float,
  PRIMARY KEY (PK, CK1, CK2, CK3)
) WITH
  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
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

我正在使用 CqlStorage() 将大量数据从 pig 转储到 cassandra;

我有大约 112 万个不同的(PK、CK1、CK2、CK3)组合

所以当我跑完 PIG

这是我的猪关系

reqDataCQL = foreach reqData generate TOTUPLE(TOTUPLE('PK',PK), TOTUPLE('CK1',CK1), TOTUPLE('Ck2',CK2), TOTUPLE('CK3',Ck3)), TOTUPLE(value);

store reqDataCQL into 'cql://MyKeyspace/tbl_samp?output_query=update+MyKeyspace.tbl_samp+set+value+%3D+%3F' using CqlStorage();

我可以看到以下内容

Input(s):
Successfully read 34327 records from: "/user/k/Input.txt"
Successfully read 4 records from: "cql://MyKeySpace/mappingtable"

Output(s):
Successfully stored 1128902 records in: "cql://MyKeySpace/tbl_samp?output_query=update+conflux.to1+set+value+%3D+%3F"

但是当我查询表 tbl_samp 时,我只能看到 8600 条记录,它们是(PK 和 CK1)的组合

这是我的计数查询

    select count(1) from tbl_samp limit 2000000;

 count
-------
  8681

我对复合键的理解有什么差距吗?

我知道 PK 是我的 RowKey 和 (CK1,CK2,CK3) 与 Value 的组合将是我的列名

我对 Cassandra Composite 的理解是

PK,(CK1|CK2|CK3|value:1),(CK11|CK22|CK33|value:11)
PK1,(CK111|CK222|CK333|value:111)

请帮帮我

【问题讨论】:

  • 您可以使用仅显示 8600 条记录的查询来编辑您的帖子吗?
  • @BryceAtNetwork23 请查找已编辑的问题

标签: cassandra apache-pig datastax-enterprise cassandra-cli cqlsh


【解决方案1】:

对于你的主键 PK、CK1、CK2、CK3:

分区键是PK。它决定行进入哪个分区。在一个分区内,CK1、CK2 和 CK3 的每个唯一组合都定义了该列。因此,主键中的所有键构成一个唯一的引用。如果插入多个具有相同 PK、CK1、CK2 和 CK3 的条目,则最后一次写入。

您的 CQL 查询是什么?密钥空间的复制因子是多少?您为读取和写入指定什么一致性级别?可能是您的读写一致性(RC 和 WC)较低,因此您正在读取尚未写入的副本。

【讨论】:

  • 我有 112 万个 PK、CK1、CK2 和 CK3 的 DISTINCT 组合,但是当我使用 CqlStorage() 存储时,它只转储了 8k,它们是 PK 和 CK1 的 DISTICNT 组合
  • 桌子上的复制因子是多少? pig 有没有办法指定 cassandra 将使用的一致性级别?尝试将键空间的复制因子设置为 3,使用 QUORUM 的写入一致性,并在选择查询中使用 CONSISTENCY QUORUM 添加。如果复制因子大于 1,并且 pig 使用 1 写入,则尝试在您的选择查询中使用一致性。你不会在生产中使用它,但看看它是否会给你预期的计数。
【解决方案2】:

对不起是我的错 我对复合键的理解是正确的。 我有一个 UDF,我正在覆盖 (PK,CK1,CK2,CK3) 的这种组合

Soo 在一般的 cassandra 存储中基于分区键以及分区键和集群列的组合给出每一行。

并且列名将是聚类列的唯一组合。

PK,(CK1|CK2|CK3|value:1),(CK11|CK22|CK33|value:11)
PK1,(CK111|CK222|CK333|value:111)

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2013-07-08
    • 2012-06-26
    • 2011-01-26
    • 1970-01-01
    • 2013-10-28
    • 2012-12-05
    • 2016-05-15
    相关资源
    最近更新 更多