# Language change : from Thrift to CQL The data model changes when using *CQL* (Cassandra Query Language). *CQL* is providing an abstraction of the low-level data stored in *Cassandra*, in opposition to *Thrift* that aims to expose the low-level data structure directly. [But note that this changes with Cassandra 3âs new storage engine.](http://www.datastax.com/2015/12/storage-engine-30) *Thrift* exposes *Keyspaces*, and these *Keyspaces* contain *Column Families*. A *ColumnFamily* contains *Rows* in which each *Row* has a list of an arbitrary number of column-values. With *CQL*, the data is **tabular**, *ColumnFamily* gets viewed as a *Table*, the **Table Rows** get a **fixed and finite number of named columns**. *Thrift*âs columns inside the *Rows* get distributed in a tabular way through the _Table Rows_. See the following figure: ```ditaa Thrift /- -\ | | | /------------\ /---------------+---------------+---------------+---------+ | | | cRED | |cFA0 1 | 2 | 3 | | | | | 1 | ----------> +---------------+---------------+---------------+ ... | +--> One Thrift | | | |c1AB 'a' | 'b' | 'c' | | | ROW | \------------/ \---------------+---------------+---------------+---------+ | | | One Thrift | -/ COLUMNFAMILY | | | /------------\ /---------------+---------------+---------+ | | | | 1 | 2 | | | | 2 | ----------> +---------------+---------------+ ... | | | | | 'a' | 'b' | | | \------------/ \---------------+---------------+---------+ | \- ----------------------------------------------------------------------- CQL /- | | /--------------------+---------------------------------+-----------------------------\ | | key | column1 | value | | +--------------------+---------------------------------+-----------------------------+ | | cRED 1 | cFA0 1 | c1AB 'a' | | +--------------------+---------------------------------+-----------------------------+ -\ | | cRED 1 | 2 | 'b' | +--> One CQL One CQL | +--------------------+---------------------------------+-----------------------------+ -/ ROW TABLE | | cRED 1 | 3 | 'c' | | +--------------------+---------------------------------+-----------------------------+ | | cRED ... | ... | ... | | +--------------------+---------------------------------+-----------------------------+ | | 2 | 1 | 'a' | | +--------------------+---------------------------------+-----------------------------+ | | 2 | 2 | 'b' | | +--------------------+---------------------------------+-----------------------------+ | | ... | ... | ... | | +--------------------+---------------------------------+-----------------------------+ \- ``` Some of the columns of a *CQL Table* have a special role that is specifically related to the *Cassandra* architecture. Indeed, the *Row key* of the *Thrift Row*, becomes the *Partition Key* in the *CQL Table*, and can be composed of 1 or multiple *CQL columns* (the key column in Figure 1). The *âColumnâ* part of the Column-value component in a *Thrift Row*, becomes the *Clustering Column* in *CQL*, and can also be composed of multiple columns (in the figure, column1 is the only column composing the *Clustering Column*, but there can be others if the Thrift's ColumnComparator is a CompositeType). Here is the basic architectural concept of *CQL*, a detailed explanation and *CQL* examples can be found in this article : [http://www.planetcassandra.org/making-the-change-from-thrift-to-cql/](http://www.planetcassandra.org/making-the-change-from-thrift-to-cql/). Understanding the *CQL* abstraction plays a key role in developing performing and scaling applications.