76、Apache Cassandra数据库数据导入、查询与更新操作指南

Apache Cassandra数据库数据导入、查询与更新操作指南

1. partitionRead函数介绍

1.1 功能概述

partitionRead 函数用于从Apache Cassandra数据库表的分区中导入数据。不过需要注意的是,该函数在未来版本中将会被移除,建议使用Apache Cassandra® Database C++接口的 partitionRead 函数替代。

1.2 语法说明

  • results = partitionRead(conn,keyspace,tablename)
  • results = partitionRead(conn,keyspace,tablename,keyValue1...keyValueN)
  • results = partitionRead( ___ ,'ConsistencyLevel',level)

1.3 详细描述

  • results = partitionRead(conn,keyspace,tablename) :通过读取Cassandra数据库表所有分区中的所有列,返回导入的数据。此函数无需使用Cassandra查询语言(CQL)查询,就能将Cassandra数据库中的数据导入到MATLAB中。
  • results = partitionRead(conn,keyspace,tablename,keyValue1...keyValueN) :通过读取由分区键值指定的一个或多个分区中的所有Cassandra列,返回导入的数据。
  • results = partitionRead( ___ ,'ConsistencyLevel',level) :设置一致性级别,用于指定函数从Cassandra数据库表读取数据时,必须响应的节点数量,可使用上述任意输入参数组合。

1.4 示例

1.4.1 从Cassandra数据库表导入数据
contactPoints = "localhost";
conn = cassandra(contactPoints);
keyspace = "employeedata";
tablename = "employees_by_job";
results = partitionRead(conn,keyspace,tablename);
head(results)
close(conn)

运行上述代码后,会显示返回的员工数据的前几行,结果如下:

ans=8×13 table
      job_id       hire_date     employee_id    commission_pct    department_id      email       

    __________    ___________    ___________    ______________    _____________    __________    
    "ST_CLERK"    08-Mar-2008        128             NaN               50          "SMARKLE"     
    "ST_CLERK"    06-Feb-2008        136             NaN               50          "HPHILTAN"    
    "ST_CLERK"    12-Dec-2007        135             NaN               50          "KGEE"        
    "ST_CLERK"    10-Apr-2007        132             NaN               50          "TJOLSON"     
    "ST_CLERK"    14-Jan-2007        127             NaN               50          "JLANDRY"     
    "ST_CLERK"    28-Sep-2006        126             NaN               50          "IMIKKILI"    
    "ST_CLERK"    26-Aug-2006        134             NaN               50          "MROGERS"     
    "ST_CLERK"    09-Jul-2006        144             NaN               50          "PVARGAS"     

结果表包含以下变量:
- job_id :职位标识符
- hire_date :入职日期
- employee_id :员工标识符
- commission_pct :佣金百分比
- department_id :部门标识符
- email :电子邮件地址
- first_name :名字
- last_name :姓氏
- manager_id :经理标识符
- office :办公地点(包含建筑物和房间两个变量的表)
- performance_ratings :绩效评级
- phone_number :电话号码
- salary :工资

1.4.2 使用分区键值导入数据
contactPoints = "localhost";
conn = cassandra(contactPoints);
keyspace = "employeedata";
tablename = "employees_by_job";
keyValue = "IT_PROG";
results = partitionRead(conn,keyspace,tablename,keyValue);
results
close(conn)

运行上述代码后,会显示返回的员工数据,结果如下:

results=5×13 table
     job_id       hire_date     employee_id    commission_pct    department_id      email       f

    _________    ___________    ___________    ______________    _____________    __________    _
    "IT_PROG"    21-May-2007        104             NaN               60          "BERNST"      "
    "IT_PROG"    07-Feb-2007        107             NaN               60          "DLORENTZ"    "
    "IT_PROG"    05-Feb-2006        106             NaN               60          "VPATABAL"    "
    "IT_PROG"    03-Jan-2006        103             NaN               60          "AHUNOLD"     "
    "IT_PROG"    25-Jun-2005        105             NaN               60          "DAUSTIN"     "
1.4.3 使用多个分区键值导入数据
contactPoints = "localhost";
conn = cassandra(contactPoints);
keyspace = "employeedata";
tablename = "employees_by_name";
keyValue1 = ["Christopher","Alexander"];
keyValue2 = ["Olsen","Hunold"];
results = partitionRead(conn,keyspace,tablename,keyValue1,keyValue2);
results
close(conn)

运行上述代码后,会显示返回的两名员工的员工数据,结果如下:

results=2×13 table
     first_name      last_name     hire_date     employee_id    commission_pct    department_id  

    _____________    _________    ___________    ___________    ______________    _____________  
    "Alexander"      "Hunold"     03-Jan-2006        103             NaN               60        
    "Christopher"    "Olsen"      30-Mar-2006        153             0.2               80        
1.4.4 使用一致性级别导入数据
contactPoints = "localhost";
conn = cassandra(contactPoints);
keyspace = "employeedata";
tablename = "employees_by_job";
keyValue = "IT_PROG";
level = "QUORUM";
results = partitionRead(conn,keyspace,tablename,keyValue, ...
    'ConsistencyLevel',level);
results
close(conn)

运行上述代码后,会显示返回的员工数据,结果如下:

results=5×13 table
     job_id       hire_date     employee_id    commission_pct    department_id      email       f

    _________    ___________    ___________    ______________    _____________    __________    _
    "IT_PROG"    21-May-2007        104             NaN               60          "BERNST"      "
    "IT_PROG"    07-Feb-2007        107             NaN               60          "DLORENTZ"    "
    "IT_PROG"    05-Feb-2006        106             NaN               60          "VPATABAL"    "
    "IT_PROG"    03-Jan-2006        103             NaN               60          "AHUNOLD"     "
    "IT_PROG"    25-Jun-2005        105             NaN               60          "DAUSTIN"     "

1.5 输入参数

  • conn :Cassandra数据库连接,指定为 cassandra 对象。
  • keyspace :键空间,指定为字符向量或字符串标量。若不知道键空间,可使用点符号访问 cassandra 对象的 Keyspaces 属性,查看Cassandra数据库中的键空间。示例: "employeedata"
  • tablename :Cassandra数据库表名,指定为字符向量或字符串标量。若不知道表名,可使用 tablenames 函数查找。示例: "employees_by_job"
  • keyValue1...keyValueN :分区键值,可指定为以下数据类型之一:
  • 数值标量
  • 数值数组
  • 字符向量
  • 字符向量的元胞数组
  • 字符串标量
  • 字符串数组
  • 逻辑值
  • 逻辑数组
  • 日期时间数组
  • 持续时间数组
    若未指定 keyValue1...keyValueN 输入参数,则 partitionRead 函数将从Cassandra数据库表的所有分区导入数据(与CQL查询 SELECT * FROM tablename 相同)。

支持的Cassandra分区键及其对应的MATLAB有效数据类型如下表所示:
| Supported Cassandra Partition Key | MATLAB Valid Data Types for One Partition | MATLAB Valid Data Types for Multiple Partitions |
| — | — | — |
| ascii | 字符向量或字符串标量 | 字符向量的元胞数组或字符串数组 |
| bigint | 数值标量或逻辑标量 | 数值数组或逻辑数组 |
| blob | 数值数组 | 数值数组的元胞数组 |
| boolean | 数值标量或逻辑标量 | 数值数组或逻辑数组 |
| date | 日期时间数组、字符串标量或字符向量 | 日期时间数组、字符串数组或字符向量的元胞数组 |
| decimal | 数值标量、逻辑标量或 java.math.BigDecimal 标量 | 数值数组、逻辑数组或 java.math.BigDecimal 数组 |
| double | 数值标量或逻辑标量 | 数值数组或逻辑数组 |
| float | 数值标量或逻辑标量 | 数值数组或逻辑数组 |
| inet | 字符向量或字符串标量 | 字符向量的元胞数组或字符串数组 |
| int | 数值标量或逻辑标量 | 数值数组或逻辑数组 |
| smallint | 数值标量或逻辑标量 | 数值数组或逻辑数组 |
| text | 字符向量或字符串标量 | 字符向量的元胞数组或字符串数组 |
| time | 持续时间数组、字符串标量或字符向量 | 持续时间数组、字符串数组或字符向量的元胞数组 |
| timestamp | 日期时间数组、字符串标量或字符向量 | 日期时间数组、字符串数组或字符向量的元胞数组 |
| timeuuid | 字符向量或字符串标量 | 字符向量的元胞数组或字符串数组 |
| tinyint | 数值标量或逻辑标量 | 数值数组或逻辑数组 |
| uuid | 字符向量或字符串标量 | 字符向量的元胞数组或字符串数组 |
| varchar | 字符向量或字符串标量 | 字符向量的元胞数组或字符串数组 |
| varint | 数值标量、逻辑标量或 java.math.BigInteger | 数值数组、逻辑数组或 java.math.BigInteger 数组 |

不支持的Cassandra分区键包括:
- counter
- list
- map
- set
- tuple
- 用户定义类型(UDTs)

  • level :一致性级别,可指定为以下值之一:
    | Consistency Level Value | Consistency Level Description |
    | — | — |
    | “ALL” | 当所有副本节点响应时返回查询结果。 |
    | “QUORUM” | 当大多数副本节点响应时返回查询结果。 |
    | “LOCAL_QUORUM” | 当本地数据中心的大多数副本节点响应时返回查询结果。 |
    | “ONE”(默认) | 当一个副本节点响应时返回查询结果。 |
    | “TWO” | 当两个副本节点响应时返回查询结果。 |
    | “THREE” | 当三个副本节点响应时返回查询结果。 |
    | “LOCAL_ONE” | 当本地数据中心的一个副本节点响应时返回查询结果。 |
    | “SERIAL” | 返回任何数据中心的副本节点的当前(可能未提交)数据的查询结果。 |
    | “LOCAL_SERIAL” | 返回本地数据中心的副本节点的当前(可能未提交)数据的查询结果。 |

可将一致性级别的值指定为字符向量或字符串标量。有关一致性级别的详细信息,请参阅“Configuring data consistency”。

1.6 输出参数

results :导入的数据结果,作为表返回。该表包含与 keyValue1...keyValueN 输入参数对应的分区中的导入数据。分区中的每个Cassandra数据库列都成为表中的一个变量,变量名与指定分区中的Cassandra数据库列名匹配。表中变量的数据类型取决于Cassandra数据类型。有关CQL数据类型如何转换为MATLAB数据类型的详细信息,请参阅“Convert CQL Data Types to MATLAB Data Types”。

2. tablenames函数介绍

2.1 功能概述

tablenames 函数用于列出Apache Cassandra数据库中的数据库表名。同样,该函数在未来版本中将会被移除,建议使用Apache Cassandra® Database C++接口的 tablenames 函数替代。

2.2 语法说明

  • t = tablenames(conn)
  • t = tablenames(conn,keyspace)

2.3 详细描述

  • t = tablenames(conn) :返回一个列表,其中包含Cassandra数据库中Cassandra数据库表的名称及其对应的键空间。
  • t = tablenames(conn,keyspace) :返回一个列表,其中包含Cassandra数据库中指定键空间中的Cassandra数据库表的名称。

2.4 示例

2.4.1 返回Cassandra数据库中的数据库表名
contactPoints = "localhost";
conn = cassandra(contactPoints);
t = tablenames(conn);
head(t)
close(conn)

运行上述代码后,会显示返回数据的前几行,结果如下:

ans=8×2 table
       Keyspace                 Table           
    ______________    __________________________
    "employeedata"    "employees_by_job"        
    "employeedata"    "employees_by_id"         
    "employeedata"    "employees_by_name"       
    "system"          "built_views"             
    "system"          "sstable_activity"        
    "system"          "views_builds_in_progress"
    "system"          "compaction_history"      
    "system"          "hints"                   

Keyspace 变量表示键空间, Table 变量表示相应键空间中Cassandra数据库表的名称。

2.4.2 返回Cassandra数据库键空间中的数据库表名
contactPoints = "localhost";
conn = cassandra(contactPoints);
keyspace = "employeedata";
t = tablenames(conn,keyspace)
close(conn)

运行上述代码后,会显示返回的数据库表名,结果如下:

t = 3×1 string array
    "employees_by_job"
    "employees_by_id"
    "employees_by_name"

2.5 输入参数

  • conn :Cassandra数据库连接,指定为 cassandra 对象。
  • keyspace :键空间,指定为字符向量或字符串标量。若不知道键空间,可使用点符号访问 cassandra 对象的 Keyspaces 属性,查看Cassandra数据库中的键空间。示例: "employeedata"

2.6 输出参数

t :Cassandra数据库中的数据库表名,指定为字符串数组或表。若在 keyspace 输入参数中指定了键空间,则 tablenames 函数将返回一个字符串数组,其中包含指定键空间中所有数据库表的名称。若未指定键空间,则 tablenames 函数将返回一个包含 Keyspace Table 变量的表。 Keyspace 变量是一个字符串数组,包含Cassandra数据库中的所有键空间。 Table 变量是一个字符串数组,包含Cassandra数据库中相应键空间的所有数据库表的名称。

3. upsert函数介绍

3.1 功能概述

upsert 函数用于在Apache Cassandra数据库中插入或更新数据。该函数在未来版本中将会被移除,建议使用Apache Cassandra® Database C++接口的 upsert 函数替代。

3.2 语法说明

  • upsert(conn,keyspace,tablename,data)
  • upsert(conn,keyspace,tablename,data,'ConsistencyLevel',level)

3.3 详细描述

  • upsert(conn,keyspace,tablename,data) :通过将数据插入或更新到Apache Cassandra数据库表中,从MATLAB导出数据。
  • upsert(conn,keyspace,tablename,data,'ConsistencyLevel',level) :为写操作设置一致性级别,指定函数将MATLAB数据导出到Cassandra数据库表时必须响应的节点数量。

3.4 示例

3.4.1 将MATLAB数据插入Cassandra数据库
contactPoints = "localhost";
conn = cassandra(contactPoints);
keyspace = "employeedata";
t = tablenames(conn,keyspace)
keyspace = "employeedata";
tablename = "employees_by_job";
results = partitionRead(conn,keyspace,tablename);
tail(results)
cols = columninfo(conn,keyspace,tablename);
cols(:,1:2)
varnames = ["job_id" "hire_date" "employee_id" ...
    "commission_pct" "department_id" "email" "first_name" ...
    "last_name" "manager_id" "office" "performance_ratings" ... 
    "phone_number" "salary"];
office = table("South",160, ...
    'VariableNames',["building" "room"]);
data = table("IT_ADMIN",datetime('today'),301,0.25,30,"SMITH123", ...
    "Alex","Smith",114,office,{[4 5]},"515.123.2345",3000);
data.Properties.VariableNames = varnames;
upsert(conn,keyspace,tablename,data)
keyValue = "IT_ADMIN";
results = partitionRead(conn,keyspace,tablename,keyValue)
close(conn)

运行上述代码后,会显示插入的数据,结果如下:

results=1×13 table
      job_id       hire_date     employee_id    commission_pct    department_id      email       

    __________    ___________    ___________    ______________    _____________    __________    
    "IT_ADMIN"    13-Mar-2019        301             0.25              30          "SMITH123"    
3.4.2 使用一致性级别更新Cassandra数据库中的数据
contactPoints = "localhost";
conn = cassandra(contactPoints);
keyspace = "employeedata";
t = tablenames(conn,keyspace)
keyspace = "employeedata";
tablename = "employees_by_job";
results = partitionRead(conn,keyspace,tablename);
tail(results)
cols = columninfo(conn,keyspace,tablename);
cols(:,1:2)
keyValue = "MK_REP";
data = partitionRead(conn,keyspace,tablename,keyValue)
data.commission_pct = 0.25;
level = "QUORUM";
upsert(conn,keyspace,tablename,data,'ConsistencyLevel',level)
keyValue = "MK_REP";
results = partitionRead(conn,keyspace,tablename,keyValue)
close(conn)

运行上述代码后,会显示更新后的数据,结果如下:

results=1×13 table
     job_id      hire_date     employee_id    commission_pct    department_id    email     first_

    ________    ___________    ___________    ______________    _____________    ______    ______
    "MK_REP"    17-Aug-2005        202             0.25              20          "PFAY"      "Pat

3.5 输入参数

  • conn :Cassandra数据库连接,指定为 cassandra 对象。
  • keyspace :键空间,指定为字符向量或字符串标量。若不知道键空间,可使用点符号访问 cassandra 对象的 Keyspaces 属性,查看Cassandra数据库中的键空间。示例: "employeedata"
  • tablename :Cassandra数据库表名,指定为字符向量或字符串标量。若不知道表名,可使用 tablenames 函数查找。示例: "employees_by_job"
  • data :要插入或更新的数据,指定为表。必须指定Cassandra数据库表的主键,但可以忽略其他Cassandra列。表中变量的名称必须与数据库表中Cassandra列的名称匹配,不区分大小写。表中变量的数据类型必须与Cassandra列的CQL数据类型兼容。有关详细信息,请参阅“Convert CQL Data Types to MATLAB Data Types”。
  • level :写操作的一致性级别,可指定为以下值之一:
    | Consistency Level Value | Write Operation |
    | — | — |
    | “ALL” | 在所有副本节点上提交。 |
    | “EACH_QUORUM” | 在每个数据中心的大多数副本节点上提交。 |
    | “QUORUM” | 在大多数副本节点上提交。 |
    | “LOCAL_QUORUM” | 在本地数据中心的大多数副本节点上提交。 |
    | “ONE”(默认) | 在一个副本节点上提交。 |
    | “TWO” | 在两个副本节点上提交。 |
    | “THREE” | 在三个副本节点上提交。 |
    | “LOCAL_ONE” | 在本地数据中心的一个副本节点上提交。 |
    | “ANY” | 在至少一个副本节点上提交。 |

可将一致性级别的值指定为字符向量或字符串标量。有关一致性级别的详细信息,请参阅“Configuring data consistency”。

3.6 总结

通过上述介绍,我们了解了 partitionRead tablenames upsert 这三个函数的功能、语法、使用示例以及输入输出参数。这些函数为我们在MATLAB中与Apache Cassandra数据库进行交互提供了便利,能够帮助我们实现数据的导入、查询和更新操作。在使用这些函数时,需要注意它们在未来版本中将会被移除,建议使用相应的C++接口函数替代。同时,要根据具体需求合理设置输入参数,确保数据操作的准确性和一致性。

4. 函数使用流程总结

4.1 数据导入流程

当需要从Apache Cassandra数据库导入数据时,可以按照以下步骤进行:
1. 建立数据库连接 :使用 cassandra 函数创建与Cassandra数据库的连接。

contactPoints = "localhost";
conn = cassandra(contactPoints);
  1. 确定键空间和表名 :可以使用 tablenames 函数查看数据库中的表名。
keyspace = "employeedata";
t = tablenames(conn,keyspace);
  1. 导入数据 :使用 partitionRead 函数导入数据,可以根据需要指定分区键值和一致性级别。
tablename = "employees_by_job";
keyValue = "IT_PROG";
level = "QUORUM";
results = partitionRead(conn,keyspace,tablename,keyValue, 'ConsistencyLevel',level);
  1. 关闭数据库连接 :操作完成后,使用 close 函数关闭连接。
close(conn);

4.2 数据插入或更新流程

当需要向Apache Cassandra数据库插入或更新数据时,可以按照以下步骤进行:
1. 建立数据库连接 :同数据导入流程的第一步。

contactPoints = "localhost";
conn = cassandra(contactPoints);
  1. 确定键空间和表名 :同数据导入流程的第二步。
keyspace = "employeedata";
t = tablenames(conn,keyspace);
  1. 准备数据 :将需要插入或更新的数据整理成表的形式。
varnames = ["job_id" "hire_date" "employee_id" ...
    "commission_pct" "department_id" "email" "first_name" ...
    "last_name" "manager_id" "office" "performance_ratings" ... 
    "phone_number" "salary"];
office = table("South",160, ...
    'VariableNames',["building" "room"]);
data = table("IT_ADMIN",datetime('today'),301,0.25,30,"SMITH123", ...
    "Alex","Smith",114,office,{[4 5]},"515.123.2345",3000);
data.Properties.VariableNames = varnames;
  1. 插入或更新数据 :使用 upsert 函数插入或更新数据,可以根据需要指定一致性级别。
tablename = "employees_by_job";
level = "QUORUM";
upsert(conn,keyspace,tablename,data,'ConsistencyLevel',level);
  1. 关闭数据库连接 :同数据导入流程的第四步。
close(conn);

4.3 函数使用流程的mermaid流程图

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(建立数据库连接):::process
    B --> C{操作类型}:::decision
    C -->|导入数据| D(确定键空间和表名):::process
    D --> E(导入数据):::process
    E --> F(关闭数据库连接):::process
    C -->|插入或更新数据| G(确定键空间和表名):::process
    G --> H(准备数据):::process
    H --> I(插入或更新数据):::process
    I --> F
    F --> J([结束]):::startend

5. 注意事项和常见问题

5.1 函数移除问题

需要注意的是, partitionRead tablenames upsert 这三个函数在未来版本中将会被移除,建议使用Apache Cassandra® Database C++接口的相应函数替代。在开发新的应用程序时,尽量避免使用这些即将被移除的函数,以免在后续版本升级时出现兼容性问题。

5.2 输入参数问题

  • 键空间和表名 :在使用这些函数时,键空间和表名必须准确无误。如果不知道键空间或表名,可以使用相应的函数进行查询。例如,使用 tablenames 函数可以查看数据库中的表名。
  • 分区键值 :分区键值的数据类型必须与Cassandra数据库中的分区键类型兼容。不同的分区键类型对应不同的MATLAB有效数据类型,具体可参考前面的表格。
  • 一致性级别 :一致性级别会影响数据操作的性能和可靠性。在选择一致性级别时,需要根据具体的应用场景进行权衡。例如,如果对数据的实时性要求较高,可以选择较低的一致性级别;如果对数据的准确性要求较高,则需要选择较高的一致性级别。

5.3 数据类型转换问题

表中变量的数据类型必须与Cassandra列的CQL数据类型兼容。在进行数据插入或更新操作时,需要确保数据类型的一致性。有关CQL数据类型如何转换为MATLAB数据类型的详细信息,请参阅“Convert CQL Data Types to MATLAB Data Types”。

6. 总结

本文详细介绍了与Apache Cassandra数据库交互的三个重要函数: partitionRead tablenames upsert 。通过这些函数,我们可以在MATLAB中方便地实现数据的导入、查询和更新操作。具体内容总结如下:
- partitionRead 函数 :用于从Cassandra数据库表的分区中导入数据,可以指定分区键值和一致性级别。
- tablenames 函数 :用于列出Cassandra数据库中的数据库表名,可以指定键空间。
- upsert 函数 :用于在Cassandra数据库中插入或更新数据,可以指定一致性级别。

同时,我们还总结了函数的使用流程、注意事项和常见问题。在使用这些函数时,需要注意它们在未来版本中将会被移除,建议使用相应的C++接口函数替代。此外,要根据具体需求合理设置输入参数,确保数据操作的准确性和一致性。希望本文能够帮助读者更好地使用这些函数,实现与Apache Cassandra数据库的高效交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值