📜  Cassandra 中的用户定义类型 (UDT) 概述

📅  最后修改于: 2021-09-09 10:21:31             🧑  作者: Mango

用户定义的数据类型:
用户定义数据 (UDT) 的优点之一是将多个数据字段附加到一列。在 Cassandra 中,UDT 起着至关重要的作用,它允许组相关的字段(例如字段 1、字段 2 等)可以是数据,并具有命名和类型。

在 Cassandra 中,UDT 的优势之一是有助于增加表和数据模型的灵活性。我们可以构造Cassandra提供的UDT:UDT,即User-Defined Type。正如我们在示例中所展示的,用户定义类型 (UDT) 可以附加多个数据字段,其中每个命名和类型都可以映射到单个列。

要构造用户定义类型 (UDT),任何有效的数据类型都可以用于 Cassandra 中的字段类型,包括集合(SET、LIST、MAP)或任何其他 UDT。一旦在 Cassandra 中创建了 UDT,就可以使用它来定义主表中的列。

Syntax to define UDT:
CREATE TYPE UDT_name 
(
  field_name 1 Data_Type 1,
  field_name 2 Data_Type 2,
  field_name 3 Data_Type 3,
  field_name 4 Data_Type 4,
  field_name 5 Data Type 5,
);

创建 UDT 的简单步骤:

步骤 1:创建一个 KEYSPACE,如果不存在。句法:

create_keyspace_statement ::=  
      CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name 
       WITH options 

步骤 2:使用以下 CQL 查询创建键空间。

CREATE KEYSPACE Emp
    WITH replication = {'class': 'SimpleStrategy', 
                        'replication_factor' : 1};  

要检查密钥空间架构,请使用以下 CQl 查询。

DESCRIBE KEYSPACE Emp;

第 3 步:使用以下 CQL 查询为当前地址创建员工用户数据类型。例如,当前地址的用户数据类型

CREATE TYPE Emp.Current_add
(
Emp_id int,
h_no text,
city text,
state text,
pin_code int,
country text 
); 

这里 Current_add 是 Cassandra 用户定义的数据类型。


图 –用户定义类型 (UDT)

步骤 4:创建表注册,将 current_address UDT 作为列之一,例如:

CREATE TABLE Registration
( 
Emp_id int PRIMARY KEY, 
Emp_Name text, 
current_address FROZEN
); 

步骤 5:要在 Cassandra 中使用 UDT 插入数据,请使用以下 CQL 查询。

格式 1:使用 JSON(JavaScript Object Notation)格式。
在 Cassandra 中,我们还可以插入 JSON(JavaScript Object Notation)格式的数据。例如:使用 JSON 格式的 CQL 查询。

INSERT INTO Registration JSON'
{
"Emp_id"            : 2000, 
"current_address"   :  { "h_no" : "A 210", "city" : 
                        "delhi", "state" : "DL",
                        "pin_code" :"201307", 
                        "country" :"india"},
"Emp_Name"          : "Ashish Rana"}' ;
 

格式 2:简单插入

INSERT INTO Registration (Emp_id, Emp_Name, current_address ) 
            values (1000, 'Ashish', { h_no :'A 210', city : 'delhi', state : 'DL', pin_code 
                                    :12345, country :'IN'});

INSERT INTO Registration(Emp_id, Emp_Name, current_address ) 
            values (1001, 'kartikey Rana', { h_no : 'B 210 ',  city 
                                    : 'mumbai', state : 'MH', pin_code 
                                    :12345, country :'IN'});

INSERT INTO Registration(Emp_id, Emp_Name, current_address ) 
            values (1002, 'Dhruv Gupta', { h_no : 'C 210', city 
                                    : 'delhi', state : 'DL', pin_code 
                                    :12345, country :'IN'}); 

输出:


图 – UDT 表插入

在这种情况下,我们将看到如何在不插入一个或多个字段的值的情况下插入命令。
例如,我们没有在此处传递字段的值。 Cassandra 将如何处理这个问题?
好吧,它会将这个值作为一个普通值插入,但它会将字段值设为空。每个字段值,除了我们在插入时没有传递的主键外,Cassandra 将其视为空值。

不插入UDT的一个字段或多个字段值的CQL查询:

INSERT INTO Registration(Emp_id, Emp_Name, current_address ) 
                 values (1003, 'Amit Gupta', { h_no : 'D 210',  city 
                               : 'Bangalore', state : 'MH', pin_code :12345}
                               );

INSERT INTO Registration(Emp_id, Emp_Name, current_address ) 
                 values (1004, 'Shivang Rana', { h_no : 'E 210', city 
                               : 'Hyderabad', state : 'HYD'});
                               

输出:


图 –未插入一个或多个字段值的 UDT 表