2017-11-18 10 views
0

私のローカルマシンでいくつかのレンジクエリを実行するためのデータ(52GB)を準備しています。カッサンドラが私のデータを期待通りに持っていない

私のデータはBSONファイルです。私はそれをrdd/dataFrameを起動するように変換し、クイックレンジクエリのためにCassandraと書いています。

私が持っていたデータには、選択するユニークな範囲がありません。したがって、monotically_increase()を呼び出して固有のrddデータフレームにcolumn(idx)を追加し、それをCassandraに書き込みました。

しかし、カサンドラはidx値を非常に大きなものに上書きしています。

train_df = train_df.withColumn("idx", monotonically_increasing_id()) 

try: 
#"CREATE TABLE t (pk int, t int, v text, s text, PRIMARY KEY (pk, t)); 
        create_table = "CREATE TABLE train (idx BIGINT, cid BIGINT, img BLOB, PRIMARY KEY (idx, cid));"                                        
        session.execute(create_table) 
    except: 
        print("create table train failed") 
    train_df.write\ 
        .format("org.apache.spark.sql.cassandra")\ 
        .mode('append') \ 
        .option("table", "train") \ 
        .option("keyspace", "komal")\ 
        .save() 

    Any query indexing above 5000 is returing empty list 
    query = "select * from train where idx > 5000 and idx <= 6000 ALLOW FILTERING;" 
    result = session.execute(query, timeout=50000000) 

    result.current_rows 
    [] 

カサンドラに列を追加する方法は、ユニークにすることができますので、範囲のクエリを実行できますか?

答えて

2

パーティションキーの範囲を選択しようとしています(この場合、idxはパーティションキーです)。これは、パーティションキーがcassandraが実際にデータを格納するノードを「選択」するときに、cassandraで作業を行う方法ではありません。クエリにはすべてのクラスタノードをスキャンする必要がありますが、それは非常に遅くなる可能性があります。

範囲クエリが必要な場合は、パーティション内で効率的なものを実行できます。あなたの例では、tはクラスタ列であり、そのパーティション内のすべてのエントリの順序を定義します(idx)。ディスク上では、データはソートされて格納されます(したがって、sstables =ソートされた文字列テーブル)。

関連する問題