2

次のようにテーブルをセットアップしました。

{"String" : {uuid1 : "String", uuid1: "String"}, "String" : {uuid : "String"}}

または...

Row_validation_class = UTF8Type
Default_validation_class = UTF8Type
Comparator = UUID

(基本的に行ラベルとして Web サイトを取得し、datetime.datetime.now() に基づいて動的に生成された列を持ち、Cassandra の TimeUUIDType と文字列を値として持っています)

Pycassa を使用して、行と列の両方に基づいてデータのスライスを取得しようとしています。ただし、他の(より小さい)テーブルではこれを行いましたが、データセット全体をダウンロードして(または少なくとも1行にフィルタリングして)、順序付けられた辞書を使用してdatetimeオブジェクトと比較できました。

Pycassa multiget または get_indexed_slice 関数のようなものを使用して、特定の列と行を取得できるようにしたいと考えています。日時でのフィルタリングを可能にするこのようなものが存在しますか。現在のすべての試行で、次のエラー メッセージが表示されます。

TypeError: can't compare datetime.datetime to UUID

私がこれまでに思いついた最高のものは...

def get_number_of_visitors(site, start_date, end_date=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f")):
    pool = ConnectionPool('Logs', timeout = 2)
    col_fam = ColumnFamily(pool, 'sessions')
    result = col_fam.get(site)
    number_of_views = [(k,v) for k,v in col_fam.get(site).items() if get_posixtime(k) > datetime.datetime.strptime(str(start_date), "%Y-%m-%d %H:%M:%S:%f") and get_posixtime(k) < datetime.datetime.strptime(str(end_date), "%Y-%m-%d %H:%M:%S:%f")]
    total_unique_sessions = len(number_of_views)
    return total_unique_sessions

get_posixtime は次のように定義されています。

def get_posixtime(uuid1):
    assert uuid1.version == 1, ValueError('only applies to type 1')
    t = uuid1.time
    t = (t - 0x01b21dd213814000L)
    t = t / 1e7
    return datetime.datetime.fromtimestamp(t)

これは機能していないようです (期待したデータが返されません)。また、必要ではないように感じます。以下を使用して列のタイムスタンプを作成しています。

timestamp = datetime.datetime.now()

誰にもアイデアはありますか?これは、Pycassa (または別の python ライブラリ) がサポートするようなものですが、その方法がわかりません。

cqlsh で記述されている ps テーブル スキーマ:

CREATE COLUMNFAMILY sessions (
  KEY text PRIMARY KEY
) WITH
  comment='' AND
  comparator='TimeUUIDType' AND
  row_cache_provider='ConcurrentLinkedHashCacheProvider' AND
  key_cache_size=200000.000000 AND
  row_cache_size=0.000000 AND
  read_repair_chance=1.000000 AND
  gc_grace_seconds=864000 AND
  default_validation=text AND
  min_compaction_threshold=4 AND
  max_compaction_threshold=32 AND
  row_cache_save_period_in_seconds=0 AND
  key_cache_save_period_in_seconds=14400 AND
  replicate_on_write=True;

ps

Pycassa で列範囲を指定できることは知っていますが、範囲の開始値と終了値に各行のエントリがあることを保証できないため、列が存在しない可能性があります。

4

1 に答える 1

2

、、、などにcolumn_startおよびcolumn_finishパラメータを使用して、列の「スライス」をリクエストしたい場合があります。TimeUUIDType コンパレータの場合、pycassa はこれら 2 つのパラメータのインスタンスまたはタイムスタンプを実際に受け入れます。タイムスタンプ コンポーネントが一致する TimeUUID のような形式に内部的に変換します。詳細を提供するTimeUUIDの操作に特化したドキュメントのセクションがあります。get()multiget()get_count()get_range()datetime

たとえば、次のように関数を実装します。

def get_number_of_visitors(site, start_date, end_date=None):
    """
    start_date and end_date should be datetime.datetime instances or
    timestamps like those returned from time.time().
    """
    if end_date is None:
        end_date = datetime.datetime.now()
    pool = ConnectionPool('Logs', timeout = 2)
    col_fam = ColumnFamily(pool, 'sessions')
    return col_fam.get_count(site, column_start=start_date, column_finish=end_date)

col_fam.get()またはで同じフォームを使用してcol_fam.xget()、訪問者の実際のリストを取得できます。

ConnectionPool()PSは、リクエストごとに新しいものを作成しないようにします。必要に応じて、プール サイズを小さく設定してください。

于 2013-08-05T23:00:30.287 に答える