2017-11-18 2 views
0

로컬 컴퓨터에서 일부 범위 쿼리를 수행하기 위해 데이터 (52GB)를 준비 중입니다.Cassandra가 예상대로 데이터를 가지고 있지 않습니다.

내 데이터는 BSON 파일에 있습니다. 나는 그것을 rdd/dataFrame을 스파크로 변환하고 빠른 범위 쿼리를 위해 Cassandra라고 적는다.

내가 선택한 데이터에는 고유 한 범위 지정 방법이 없으므로 monotically_increase()을 호출하여 고유 한 rdd 데이터 프레임에 column(idx)을 추가하고이를 Cassandra에 씁니다.

그러나 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 = 정렬 된 문자열 테이블) 범위에 대한 쿼리가 효율적입니다.