2016-07-20 17 views
2

私は、ログファイルにデータを頻繁に書き込む割合のセンサーを持っています。これらのログをCassandraに保存し、Sparkと一緒に処理したいと思います。Cassandra - TimeUUIDでタイムスタンプを複製しますか?

私はTimeUUIDカラムを使って、注文を自動的に保存するためにタイムスタンプを保存することを考えました。私のクエリでは範囲クエリが頻繁に使用されるため、これが理想的かもしれないと考えました。しかし、私のログには、ログの頻度のために、に重複タイムスタンプが含まれている可能性があります。ログはcassandraにストリーミングされません。私は過去のデータだけで作業しています。タイムスタンプは私の複合主キーの一部になります。私は行キーを列挙して、重複したタイムスタンプを持つ行を一意にすることができる実行可能な列を考えることはできません。

documentationは、次のように述べています。「minTimeuuid関数とmaxTimeuuid関数によって返される値は、値がRFC 4122で指定された時間ベースのUUID生成プロセスに適合しないという点で、真のUUIDではありません。今の機能とは異なります。

nowを使用する代わりにTimeUUIDの日付を強制すると、これによって以前のデータが上書きされることがあります。

Java/Scalaを使用して、履歴データを.jsonからCassandraに一括挿入します。 (カサンドラ3.0.8 | CQLの仕様3.4.0 |ネイティブプロトコルV4)


どのように私は私のデータ内の重複したタイムスタンプを持つことができますか?

  1. プライマリキーにTimeUUID(現在)を使用し、実際の日付/時刻を別の列に保存しますか?これにより、実際の日付/時刻を既に注文しているというメリットが失われてしまいます。
  2. Java/Scalaアプリケーションが有効でユニークなTimeUUIDを生成することを確認する必要がありますか?もしそうなら、共通のライブラリがありますか?

他の(より良い)オプションがありますか?

おかげ

答えて

2

timeuuidsを一意の識別子として使用することは、適切なアプローチです。正常に完了すると、重複はありません。 timeuuidはtype 1 uuidであり、タイムスタンプだけでなく、同じ時点でも一意性を保証するためのエントロピーも含まれています。

これで問題は解決します。履歴データのタイムアウトをどのように生成する必要がありますか?あなたが指摘したように、minTimeuuid/maxTimeuuid関数は適切なバージョン1uuidを生成するのには適していません。それは彼らの目的ではないので、大丈夫です。残念ながら、CQLは(CQL 3.3のように)与えられたタイムスタンプのためにそれらを生成する機能を提供していません

SELECT * FROM sensor_readings 
    WHERE sensor_id = 123 
    AND ts > maxTimeuuid('2016-07-15 00:00+0000') 
    AND ts < minTimeuuid('2016-07-17 00:00+0000') 

ので、あなたのクライアントの必要があります。あなたは、時間の範囲であり、使用してデータを照会しているときに後で必要になりますuuidを生成する。それを行うJavaライブラリがいくつかあります。いくつかの提案については、this questionを参照してください。一意性を保証する品質ライブラリを選択してください。

1

まず最初にすべての、ご注文や、あなたのデータを照会する方法のアイデアが本当にカサンドラを使用することが可能であることを確認してください。範囲クエリは特定のパーティションキーに基づいてのみ動作します。 PRIMARY KEY(sensor_id, time)。ほとんどの場合、パーティション化キーによる区別は、タイムスタンプが一意であることを確認するのに十分です。

グローバルに一意の時間ベースのUUIDを生成する必要がある場合は、履歴データをインポートするだけでなく、最後に取得したUUIDを追跡してユニークなUUIDを作成する共有UUIDジェネレータを実装することもできますタイムスタンプを作成し、オーバーラップの場合に新しい一意のタイムスタンプを作成するために一定量のナノ秒単位で増分するため、値は常に単調増加します。

関連する問題