At first, we create a Keyspace named "Sample" and Column Family named "SCTest" via Cassandra-cli.
As default , column type was "Standard" , so we need to assign column type to "Super".
then , we using Thrift to insert Super Column to DB , here is the sample code. Following code almost same as Thrift Examples, I only change some place to insert super column.
using System; using System.Collections.Generic; using System.Text; using Apache.Cassandra; using Thrift.Protocol; using Thrift.Transport; namespace Cassandra_SuperColumn { class Program { static void Main() { InsertSuperColumn(); Console.ReadLine(); } protected static void InsertSuperColumn() { //connect to localost cassandra service TTransport frameTransport = new TFramedTransport(new TSocket("localhost", 9160)); TProtocol frameProtocol = new TBinaryProtocol(frameTransport); var client = new Cassandra.Client(frameProtocol, frameProtocol); frameTransport.Open(); Console.WriteLine("Connected to Cassandra"); //set keyspace client.set_keyspace("Sample"); long timeStamp = Convert.ToInt64(DateTime.UtcNow.AddHours(8).Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds); /*SuperColumn group 1*/ //add cols var columns1 = new List<Column> { new Column{Name = Encoding.UTF8.GetBytes("Popular"),Value = Encoding.UTF8.GetBytes("404"),Timestamp = timeStamp}, new Column{Name = Encoding.UTF8.GetBytes("Link"),Value = Encoding.UTF8.GetBytes("http://www.died.tw"),Timestamp = timeStamp}, new Column{Name = Encoding.UTF8.GetBytes("Article"),Value = Encoding.UTF8.GetBytes(""),Timestamp = timeStamp} }; //set super column var superColumn1 = new SuperColumn { Name = Encoding.UTF8.GetBytes("SC1"), Columns = columns1 }; //put into mutation var mu1 = new Mutation { Column_or_supercolumn = new ColumnOrSuperColumn { Super_column = superColumn1 } }; /*SuperColumn group 2*/ var columns2 = new List<Column> { new Column{Name = Encoding.UTF8.GetBytes("Rank"),Value = Encoding.UTF8.GetBytes(""),Timestamp = timeStamp}, new Column{Name = Encoding.UTF8.GetBytes("Date"),Value = Encoding.UTF8.GetBytes(string.Format("{0:yyyy/MM/dd hh:mm:ss}",DateTime.Now)),Timestamp = timeStamp} }; var superColumn2 = new SuperColumn { Name = Encoding.UTF8.GetBytes("SC2"), Columns = columns2 }; var mu2 = new Mutation { Column_or_supercolumn = new ColumnOrSuperColumn { Super_column = superColumn2 } }; //put all mutation to list var lm = new List<Mutation> {mu1,mu2}; //set column family var dictMutation = new Dictionary<string, List<Mutation>> { { "SCTest", lm } }; //set key and input value var insertDataMap = new Dictionary<byte[], Dictionary<string, List<Mutation>>> { { Encoding.UTF8.GetBytes(string.Format("{0:yyyyMMdd}", DateTime.Now)), //key dictMutation //value } }; //batch insert Console.WriteLine("Inserting data"); client.batch_mutate(insertDataMap, ConsistencyLevel.ALL); //close frameTransport.Flush(); frameTransport.Close(); Console.WriteLine("Connect closed"); } } }
In the example , I add one column (Key:datetime) with 2 super column , both super column contain different columns.
After insert data success , we can use "List" command to show data in the column family.
You can see the record added , but it's unreadable . That because Cassandra column default was save as "Byte" , so after convert , the value that we insert was hard to read by human.
We can use "assume" command to make the value readable , after that , you can see the data that we insert was correct , congratulations !!
No comments:
Post a Comment