CREATE TYPE
Creates a custom data type in the keyspace that contains one or more fields of related information, such as address (street, city, state, and postal code).
The scope of a user-defined type (UDT) is keyspace-wide.
| 
 UDTs cannot contain counter fields.  | 
Syntax
CREATE TYPE [ IF NOT EXISTS ] [<keyspace_name>].<type_name> (<field_name> <cql_datatype> [ , <field_name> <cql_datatype> ... ]) ;
Syntax legend
| Syntax conventions | Description | 
|---|---|
UPPERCASE  | 
Literal keyword.  | 
Lowercase  | 
Not literal.  | 
  | 
Variable value. Replace with a user-defined value.  | 
  | 
Optional.
Square brackets (  | 
  | 
Group.
Parentheses (   | 
  | 
Or.
A vertical bar (  | 
  | 
Repeatable.
An ellipsis (   | 
  | 
Single quotation (  | 
  | 
Map collection.
Braces (  | 
Set, list, map, or tuple.
Angle brackets (   | 
|
  | 
End CQL statement.
A semicolon (  | 
  | 
Separate the command line options from the command arguments with two hyphens (   | 
  | 
Search CQL only: Single quotation marks (  | 
  | 
Search CQL only: Identify the entity and literal value to overwrite the XML element in the schema and solrConfig files.  | 
Parameters
| Parameter | Description | Default | 
|---|---|---|
  | 
Optional. Name of the keyspace that contains the table to index.  | 
If no name is specified, the current keyspace is used.  | 
  | 
Unique name for the type. CQL types are reserved for a list. See type names.  | 
|
  | 
Define fields that are in the UDT in a comma-separated list with   | 
|
  | 
Valid CQL data type.  | 
Usage notes
Once created, UDTs can be used either in a frozen or non-frozen state. In a frozen state, the UDT is stored as a single value, and cannot be altered or updated except as a whole. In a non-frozen state, the UDT is stored as a collection of fields, and can be updated individually.
Examples
Simple example
This example creates a user-defined type cycling.basic_info that consists of personal data about an individual cyclist.
CREATE TYPE IF NOT EXISTS cycling.basic_info ( 
  birthday timestamp, 
  nationality text, 
  height text,
  weight text
);
DESCRIBE TYPE cycling.basic_info;
After defining the UDT, you can create a table that has columns with the UDT. CQL collection columns and other columns support the use of user-defined types, as shown in Inserting UDTs.
Example with TTL
This example creates a user-defined type (UDT) cycling.basic_info_withTTL that consists of personal data about an individual cyclist, which includes the next_race column that will be set with a timestamp and time-to-live (TTL).
CREATE TYPE IF NOT EXISTS cycling.basic_info_expire (
  birthday timestamp,
  nationality text,
  height text,
  weight text,
  next_race text
);
DESCRIBE TYPE cycling.basic_info_expire;
To insert an entire row of data into a table using a timestamp and TTL, specify the values with an INSERT command:
INSERT INTO cycling.basic_info_TTL_expire (
  id, lastname, basics
) VALUES (
  e7ae5cf3-d358-4d99-b900-85902fda9bb0,
  'FRAME',
  {
    birthday : '1993-06-18',
    nationality : 'New Zealand',
    weight : '175',
    height : '72',
    next_race : 'Amgen Tour of California'
  }
)
USING TIMESTAMP 100 AND TTL 10000;
To insert a single UDT value with a TTL, use a UPDATE command:
UPDATE cycling.basic_info_TTL_expire USING TTL 100 
  SET basics =   {
    birthday : '1993-06-18',
    nationality : 'New Zealand',
    weight : '175',
    height : '72',
    next_race : 'Tour de France'
  }
WHERE id = e7ae5cf3-d358-4d99-b900-85902fda9bb0;
To check the write time and TTL values of a UDT use the WRITETIME and TTL functions in a SELECT command:
SELECT WRITETIME(basics), TTL(basics) FROM cycling.basic_info_TTL_expire 
WHERE id = e7ae5cf3-d358-4d99-b900-85902fda9bb0;
Results
 writetime(basics) | ttl(basics)
-------------------+-------------
  1718927360245508 |          99
(1 rows)
It is important to note that you cannot use selection function writeTime on non-frozen UDT basics.
This is because the UDT is not frozen and the write time is not stored with the UDT.
| 
 A string with a single quote in a UDT   |