Search code examples
javacassandraastyanax

Upsert data into Cassandra database using Astyanax client


Problem Statement:-

I am trying to insert data into Cassandra database. I am using Netflix/Astyanax client for this.

Below is the code which will upsert data into Cassandra database using Astyanax client.

In my below method, it accepts two parameter. One is the userId which I will be using as the RowKey and attributes map which will contain, column name as the key and it's column value as the value in the map.

Now how can I use Astyanax client to upsert data into Cassandra database using the below method which accepts those two parameters?

I am mainly concern about attributes Map. How should I use that map to upsert data into Cassandra database?

/**
 * Performs an upsert of the specified attributes for the specified id.
 */
public void upsertAttributes(final String userId, final Map<String, String> attributes) {

    MutationBatch m = CassandraAstyanaxConnection.getInstance().getKeyspace().prepareMutationBatch();

    m.withRow(CassandraAstyanaxConnection.getInstance().getEmp_cf(), userId)
    .putColumn(attributeName from attributesMap, attributeValue from attributesMap, null)
    ;

    try {
        m.execute();
    } catch (ConnectionException e) {
        StringBuilder message = new StringBuilder();
        message.append("Failed to read from C* = '").append(e).append("'. ");

        LOG.error("Failed to write data to C*", e);

        throw new RuntimeException("failed to write data to C*", e);
    }
}

Solution

  • You have almost given the solution, but i think its not clear to you

     MutationBatch m = CassandraAstyanaxConnection.getInstance().getKeyspace().prepareMutationBatch();
     ColumnListMutation<String> clm = m.withRow(CassandraAstyanaxConnection.getInstance().getEmp_cf(), userId);
     for(String key: attributeMap.keySet()){
         clm.putColumn(key, attributeMap.get(key), null);
     }
    
    try {
        m.execute();
    } catch (ConnectionException e) {
        e.printStackTrace();
    }
    

    Basically putColumn has different overloaded variations, so it will support all the datatypes supported by cassandra.