2012-12-07 77 views
1

如果您的應用程序頻繁更改並且頻繁添加功能,我一直會閱讀Cassandra。如何從另一個列中填充Cassandra列族?

這很有意義,因爲您沒有任何固定的模式,您可以向行添加列以滿足您的需求,而不是運行ALTER TABLE查詢,這可能會凍結您的數據庫數小時以用於非常大的表。

但是我有一個我不能解決的問題。 比方說,我有:

CREATE COLUMN FAMILY Students 
    with comparator='CompositeType(UTF8Type,UTF8Type), 
    and key_validation_class=UUIDType; 

每個學生具有一定的通用列(你知道,元:用戶名,元:密碼,薈萃:姓等),再加上每個學生可以跟隨ñ課程。該N-N關係使用非規範化解決,向每個學生添加N列(課程:ID1,課程:ID2)。

另一方面,我可能有一個課程CF,其中每行包含以下所有學生UUID。

所以我可以問「哪些課程後跟XXX」和「哪些學生按照課程YYY」。

問題是:如果我沒有創建第二列家族,該怎麼辦?也許在創建應用程序時,讓學生遵循特定的課程並不是必需的。

這是一個簡單的例子,但我相信這是很常見的。 「有了Cassandra,你可以根據查詢而不是關係來計劃CFs。」我現在需要這個查詢,而起初它不是必需的。

給定一張有數千條記錄的學生表格,你將如何填寫課程CF?這是Hadoop,Pig或Hive的工作(我從來沒有碰過任何這些,只是猜測)。

+0

可能的副本[什麼是最快的方式複製列家庭卡桑德拉?](http://stackoverflow.com/questions/12086395/what-is-the-fastest-way-to-copy-column-family -in-cassandra) –

+0

@ChrisGerken:我不這麼認爲。他不想複製數據;他希望根據現有數據生成新的數據。這需要不同的工具。 –

+0

嗯,重要的是,有一種方法可以快速完成這項工作,並行通過Pig,並且該操作不會DOS背後的應用程序... –

回答

3

Pig(使用Hadoop集成)對於這類工作實際上是完美的,因爲您不僅可以讀取數據,還可以使用CassandraStorage將數據寫回到Cassandra。它爲您提供並行處理功能,以最短的時間和最高的開銷完成工作。否則,另一種方法是編寫一些東西來自己完成提取,然後編寫新的CF.

這裏是豬的例子,從一組在一個CF數據的計算平均值,並將其輸出到另一個:

rows = LOAD 'cassandra://HadoopTest/TestInput' USING CassandraStorage() AS (key:bytearray,cols:bag{col:tuple(name:chararray,value)}); 
columns = FOREACH rows GENERATE flatten(cols) AS (name,value); 
grouped = GROUP columns BY name; 
vals = FOREACH grouped GENERATE group, columns.value AS values; 
avgs = FOREACH vals GENERATE group, 'Pig_Average' AS name, (long)SUM(values.value)/COUNT(values.value) AS average;  
cass_group = GROUP avgs BY group; 
cass_out = FOREACH cass_group GENERATE group, avgs.(name, average); 
STORE cass_out INTO 'cassandra://HadoopTest/TestOutput' USING CassandraStorage(); 
+0

是的 - 答案是:編寫應用程序代碼來完成它。 – Sarge

+2

@Sarge:好的,如果你打電話給豬「應用程序代碼」,那麼我想是的。我認爲它更像是一個快速的腳本工具。 –

+0

好吧,顯而易見的答案是「讀取所有行,寫回新表」。但是我很想看到Hadoop爲這種工作付諸行動。另外,閱讀卡桑德拉的所有行並不那麼高效...... –

0

如果使用現有的卡桑德拉文件,你將不得不放鬆身心的數據。由於NOSQL文件是單向的,因此這可能是Cassandra本身非常耗時的操作。數據必須按照與第一個文件相反的順序排序。坦率地說,我相信你將不得不回到用來填充第一個文件並從中填充這個新文件的原始數據。

相關問題