Friday, August 31, 2012

[nosql] Cassandra Thrift insert Super Column

This post will show how to insert Super Column to Cassandra by using Thrift API.

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()

        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);
            Console.WriteLine("Connected to Cassandra");

            //set keyspace

            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(""),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);

            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