2012-12-04 63 views
1

我必須創建並查詢具有組合鍵的列家族作爲[timestamp,long]。另外, 查詢時我想爲範圍查詢時間戳(如xxx和yyy之間的時間戳)這可能嗎?作爲cassandra列家族/ hector的鍵的時間戳/日期

目前我正在做一些非常有趣的事情(我知道它不正確)。我使用時間戳字符串爲給定範圍創建鍵並與長連接。

like , 
1254345345435-1234 
3423432423432-1234 
1231231231231-9999 

並將密鑰組傳遞給hector api。 (所以如果我有日期範圍爲1個月,我想每分鐘的數據,我創建30 * 24 * 60 * [次要密鑰長 - 數])

我可以解決與組合鍵的串聯問題。但查詢部分是我想了解的。

據我所知,因爲我們使用RandomPartitioner,所以我們不能根據範圍進行真正的查詢,因爲密鑰是MD5校驗和。這種用例的理想設計是什麼?

我的架構和要求如下:(實際CSH)

CREATE TABLE report(
     ts timestamp, 
     user_id long, 
     svc1 long, 
     svc2 long, 
     svc3 long, 
     PRIMARY KEY(ts, user_id)); 

select from report where ts between (123445345435 and 32423423424) and user_id is in (123,567,987) 
+0

您理解正確 - 沒有使用隨機分區程序的rowkey範圍查詢。 – tysonjh

+0

@tysonjh這種情況下的替代方法是什麼?我認爲它很常見......簡單的時間表圖表。 –

+0

您需要在計劃查詢它的方式之後對模式進行建模,因此請使用合適的粒度爲您希望進行範圍查詢的值創建反向(又名反向,反向)索引,以便以期望的精度查詢它們。 – tysonjh

回答

-1

你爲什麼不使用寬行,其中的關鍵是時間戳和列名作爲長值,那麼你可以將多個關鍵的(時間戳)到getKeySlice並通過那裏的名字(這是id)選擇多列到withColumnSlice。

由於我不知道列名和值是什麼,我覺得這可以幫助你。你能否提供你的專欄定義的更多細節。

+0

他想在時間戳上進行範圍查詢,所以這是行不通的。 –

+0

@rs_atl根據我的理解,我將無法觸發範圍查詢,因爲鍵是md5 ......是否正確?或者有其他替代方案......這裏的簡單場景是顯示時間表圖表。有沒有更好的方法來設計專欄家族? @ user1793389因此無論如何我將不得不通過所有的密鑰? –

+0

你是對的。您可以使用ByteOrderedPartitioner對密鑰執行範圍查詢,但這不是一個好主意,因爲集羣幾乎肯定會變得不平衡。另一種方法是我在回答中提出的建議。 –

2

您無法對組合鍵的第一個組件執行範圍查詢。相反,你應該寫一個標記值,比如daystamp(當天午夜的unix時代)作爲關鍵字,然後寫一個複合列作爲timestamp:long。通過這種方式,您可以提供組成範圍的鍵,並在組合列的時間戳組件上進行切片。

+1

反正規化的勝利! – tysonjh

1

非規範化!您必須以能夠啓用您希望執行的查詢類型的方式對模式進行建模。我們爲這些場景創建一個反向(又名倒置,逆向)索引。

CREATE TABLE report(
    KEY uuid PRIMARY KEY, 
    svc1 bigint, 
    svc2 bigint, 
    svc3 bigint 
); 

CREATE TABLE ReportsByTime(
    KEY ascii PRIMARY KEY 
) with default_validation=uuid AND comparator=uuid; 

CREATE TABLE ReportsByUser(
    KEY bigint PRIMARY KEY 
)with default_validation=uuid AND comparator=uuid; 

請參閱here一個很好的解釋。你現在正在做的是在times表中生成你自己的ascii密鑰,以使你自己能夠執行你想要的範圍分片查詢 - 它不一定是ascii,儘管你可以用它編程生成你自己的切片密鑰。

您可以使用這種方法來促進所有查詢,這可能不會直接適合您的應用程序,但想法是相同的。您可以通過向上面每個表格的列鍵添加有意義的值來獲取更多信息。

cqlsh:tester> select * from report; 
KEY         | svc1 | svc2 | svc3 
--------------------------------------+------+------+------ 
1381b530-1dd2-11b2-0000-242d50cf1fb5 | 332 | 333 | 334 
13818e20-1dd2-11b2-0000-242d50cf1fb5 | 222 | 223 | 224 
13816710-1dd2-11b2-0000-242d50cf1fb5 | 112 | 113 | 114 


cqlsh:tester> select * from times; 
KEY,1212051037 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 | 1381b530-1dd2-11b2-0000-242d50cf1fb5,1381b530-1dd2-11b2-0000-242d50cf1fb5 
KEY,1212051035 | 13816710-1dd2-11b2-0000-242d50cf1fb5,13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 
KEY,1212051036 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 

cqlsh:tester> select * from users; 
KEY   | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5 
-------------+--------------------------------------+-------------------------------------- 
23123123231 | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5