I am working on a project in which I am supposed to store the snappy
compressed data in Cassandra, so that when I retrieve the same data from
Cassandra, it should be snappy compressed in memory and then I will
decompress that data using snappy to get the actual data from it.

I am having a byte array in `bytesToStore` variable, then I am snappy
compressing it using google `Snappy` and stored it back into Cassandra -

    // .. some code here
    System.out.println(bytesToStore);

    byte[] compressed = Snappy.compress(bytesToStore);

    attributesMap.put("e1", compressed);

    ICassandraClient client = CassandraFactory.getInstance().getDao();
    // write to Cassandra
    client.upsertAttributes("0123", attributesMap, "sample_table");

After inserting the data in Cassandra, I went back into CQL mode and I
queried it and I can see this data in my table for the test_id `0123`-

    cqlsh:testingks> select * from sample_table where test_id = '0123';

     test_id | name | value

---------+-------------+------------------------------------------------------------------------------------------------
        0123 |   e1 |
0x2cac7fff0000012c4ebb95550000001e42797465204172726179205465737420466f722042696720456e6469616e


Now I am trying to read the same data back from Cassandra and everytime it
is giving me `IllegalArgumentException` -

    public Map<String, byte[]> getDataFromCassandra(final String rowKey,
final Collection<String> attributeNames) {

        Map<String, byte[]> dataFromCassandra = new
ConcurrentHashMap<String, byte[]>();

        try {
            String query="SELECT test_id, name, value from sample_table
where test_id = '"+rowKey+ "';";
            //SELECT test_id, name, value from sample_table where test_id =
'0123';
            System.out.println(query);

            DatastaxConnection.getInstance();

            ResultSet result =
DatastaxConnection.getSession().execute(query);

            Iterator<Row> it = result.iterator();

            while (it.hasNext()) {
                Row r = it.next();
                for(String str : attributeNames) {
                    ByteBuffer bb = r.getBytes(str); // this line is
throwing an exception for me
                    byte[] ba=new byte[bb.remaining()];
                    bb.get(ba, 0, ba.length);
                    dataFromCassandra.put(str, ba);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return dataFromCassandra;
    }

This is the Exception I am getting -

    java.lang.IllegalArgumentException: e1 is not a column defined in this
metadata

In the above method, I am passing rowKey as `0123` and `attributeNames`
contains `e1` as the string.

I am expecting Snappy Compressed data in `dataFromCassandra` Map. In this
map the key should be `e1` and the value should be snappy compressed data
if I am not wrong.. And then I will iterate this Map to snappy decompress
the data..

I am using Datastax Java client working with Cassandra 1.2.9.

Any thoughts what wrong I am doing here?

Reply via email to