2016-10-01 33 views
3

私はsensordataを持つCassandra 3.7にテーブル/カラムファミリーを持っています。私はこの表から選択するとCassandraの同じプライマリキーの重複する行/列

CREATE TABLE test.sensor_data (
    house_id int, 
    sensor_id int, 
    time_bucket int, 
    sensor_time timestamp, 
    sensor_reading map<int, float>, 
    PRIMARY KEY ((house_id, sensor_id, time_bucket), sensor_time) 
) 

は今、私は同じ主キー、私は不可能だと思った何かのために重複を見つけます。

cqlsh:test> select * from sensor_data; 

house_id | sensor_id | time_bucket | sensor_time      | sensor_reading 
----------+-----------+-------------+---------------------------------+---------------- 
     1 |   2 |   3 | 2016-01-02 03:04:05.000000+0000 |  {1: 101} 
     1 |   2 |   3 | 2016-01-02 03:04:05.000000+0000 |  {1: 101} 

私は問題の一部は、このデータは、JavaとDatastaxのJavaドライバーを使用して「ライブ」書かれているの両方、およびそれがsstableloaderを使用して別のソースからの過去のデータと一緒にロードされていることだと思います。

これは可能ではありません。 私は、このクラスタに従来のcassandra-cliと接続する方法がありません。おそらく、それは私にcqlshを使って見ることができないものを教えてくれたでしょう。

質問:
*これは既知の状況で発生する可能性がありますか?
* cqlshを使用して、より多くの生データを読み取ることはできますか?具体的には、これらの2つの行の時間を書き込みます。 writetime()関数は主キーやコレクションでは動作できません。

ありがとうございました。

更新:blobAsBigIntを使用して

これはコメント、答えと他のソース
から、私が試したものです*選択は後、カサンドラ・CLIを使用して接続*すべて同じ行
に同じ大きな整数を与えます倹約を可能にすることは可能ですが、テーブルを読むことはできません。これは、3.xの
*はsstabledumpを使用してダンプした後、サポートされていないのです継続中であるが、別の週または2かかると予想;)

+0

...再現するために管理し、日時インサートのBIGINTのインプレースを使用して、いくつかのペテンをしようとしました、あなたは確認することができますcassandra-cliのデータですか? – Nick

+0

いいえ、3.xではcassandra-cliはサポートされていません。私はsstabledumpを行うことができますが、データファイルは膨大であり、そのツールはフィルタリングを提供しません。 –

+0

私はsensor_timeが両方の行で異なっていると思いますが、時間が同じであるかのように切り捨てられて表示されます。カサンドラのメーリングリストにもお尋ねすることができます。 – Nick

答えて

-1

「sensor_time」は主キーの一部です。 「Partition Key」にはありませんが、「Clustering Column」です。これが2つの「行」を得る理由です。

しかし、ディスクテーブルでは、両方の「視覚的な行」が単一のCassandra行に格納されます。実際には、それらは単に異なる列であり、CQLは2つの「視覚的な行」であるとふりまとめています。

明確化 - 私はCassandraとしばらく働いていませんでしたので、正しい用語を使用しない可能性があります。私が「視覚的な行」と言うとき、私はCQLの結果が示すものを意味します。

更新

あなたは次のような実験を作成することができます(無視して、私が行います構文エラーを修正してください)。

この複合主キーを持つテーブルを行うこととします

  • 「状態」「パーティション・キー」と
  • 「都市」は「クラスタリング列」です。

    ( 状態はint、 市のint型、 名のテキスト、 主キー((状態)、都市) )をテーブルの都市を作成します。

    都市(state、city、name)の値(1,1、 'New York')に挿入します。 都市(state、city、name)の値(1,2、 'Corona')に挿入します。

    select * from cities where state = 1;

    1, 1, New York 
    1, 2, Corona 
    

    しかし、ディスク上で、これは、このように単一の行に保存されます:

このようなものを返します

あなたができるような複合主キーを持っている
+-------+-----------------+-----------------+ 
| state | city = 1  | city = 2  | 
|  +-----------------+-----------------+ 
|  | city | name  | city | name  | 
+-------+------+----------+------+----------+ 
| 1  | 1 | New York | 2 | Corona | 
+-------+------+----------+------+----------+ 

それを選択または削除します。問題の

select * from cities where state = 1; 
delete from cities where state = 1; 

、主キーは次のように定義されます

PRIMARY KEY ((house_id, sensor_id, time_bucket), sensor_time) 

これは

  • "house_id"、 "sensor_id"、 "time_bucket" を意味する "パーティション・キー" と
  • です
  • 「sensor_time」は「クラスタリング列」です。

これを選択すると、実際の行が吐き出され、複数の行があるかのように表示されます。

更新

http://www.planetcassandra.org/blog/primary-keys-in-cql/

PRIMARY KEYの定義は2つの部分から構成されています。パーティション・キー とクラスタリング列。最初の部分はストレージエンジン の行キーにマッピングされ、2番目の列は行の列をグループ化するために使用されます。 ストレージエンジンでは、列には、クラスタリング列の値の前にその名前の接頭辞「 」がグループ化されます。これは、Thrift APIを使用する場合の標準デザインパターン です。しかし、現在、CQLはテーブル内のキー以外のフィールドとの間でカラム値をクラスタリングすることを考慮しています。

「The Composite Enchilada」の説明を読んでください。

+0

私はこれが本当であるとは思わない、少なくとも3.xの後ではない。保存方法にかかわらず、プライマリキー全体が同じであれば、読み込み時にフィルタリングする必要があります。 –

+0

これはdatastaxのウェブサイトのどこかに大きな説明がありましたが、私はそれを見つけることができません。私はあなたができる実験で編集します。 – Nick

0

タイムスタンプフィールドにナノ秒が表示されるとは予想されません。さらに、完全にサポートされていないという印象を受けますか?私はあなたのドライバーのいずれかを使用している疑いがあるだろうので、これは理にかなって

INSERT INTO sensor_data(house_id, sensor_id, time_bucket, sensor_time) VALUES (1,2,4,1451692800000); INSERT INTO sensor_data(house_id, sensor_id, time_bucket, sensor_time) VALUES (1,2,4,1451692800001);

SELECT house_id, sensor_id, time_bucket, blobAsBigint(sensor_time) FROM test.sensor_data;

私は整数を経由して行を挿入してやって、それを複製することができた:これを試してみてくださいbigintはタイムスタンプを挿入し、実際にはdatetimeを使用している可能性があります。

は...これを再現するタイムゾーンとbigints両方で遊んでみました唯一のbigintは house_id | sensor_id | time_bucket | sensor_time | sensor_reading ----------+-----------+-------------+--------------------------+---------------- 1 | 2 | 3 | 2016-01-02 00:00:00+0000 | null 1 | 2 | 4 | 2016-01-01 23:00:00+0000 | null 1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null 1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null 1 | 2 | 4 | 2016-01-02 01:01:00+0000 | null 再現可能編集であるように思える:

+0

あなたのように整数を挿入すると2行も表示されますが、通常と 'blobAsBigInt'の両方で異なる値が表示されます。これを私の大きなクラスターに対して実行すると、3つの行すべてに対して 'blobAsBigInt'の値が同じになります。 –

+0

@Andreasまあ、私はちょっと寂しいです。私がキャサンドラについて知っていることは、あなたがそこに持っているものは不可能ではないはずです。私はあなたの調査が示すものを知ることに興味があります。 2つ目の考えとして、複数のノードにクエリを実行していますか?記述test.sensor_dataからの出力は何ですか? – Highstead

+0

私は 'tracing on'から1つのノードだけを照会することがわかります。他のノードを調べたり、「一貫性のあるすべて」を追加すると同じ結果が得られます。したがって、この「エラー」はデータを保持するすべてのノードにあります。 –

関連する問題