Skip to content

Stage

在 MatrixOne,Stage 用于连接外部存储位置(如 AWS S3、MINIO 或文件系统),从而支持数据文件的批量导入、导出以及管理。DATALINK 则是一种数据类型,用于引用和访问外部存储上的数据文件,使得数据库能够直接关联外部资源,而无需将文件内容直接存储在数据库内。这种结构化管理不仅减少了数据库存储需求,还提供了灵活的数据访问方式。

将外部 Stage 与 DATALINK 结合使用,可以实现数据文件的高效管理和处理。通过这种组合方式,平台可以更轻松地存储、加载大数据量的外部文件,如数据集和模型文件,并为各种分析和处理任务提供持续的文件更新支持。这对于需要快速访问和动态更新的场景尤其有帮助,例如定期的数据分析、模型训练和实时数据处理等。

应用场景

stage 和 datalink 的使用场景非常广泛,尤其适合大规模数据处理、分析以及模型训练等需求较高的应用场景。以下是一些典型应用场景:

  • 数据集管理与处理:在日常数据处理和分析工作中,大型数据集往往存储在外部存储上,如 AWS S3。通过外部 Stage,平台能够轻松配置并访问这些数据源,同时利用 DATALINK 数据类型直接引用和读取文件位置,无需将数据导入数据库。这样可以节省数据库存储,快速加载数据集,便于数据科学家进行数据清理、预处理等工作。

  • 机器学习模型训练和更新:随着数据变化,机器学习模型需要频繁更新以保证预测准确性。在这种情况下,外部 Stage 可用于存储训练数据集和模型文件,并通过 DATALINK 快速引用模型文件。训练新模型时,可以直接从外部存储加载最新数据,同时将训练好的模型版本保存在外部位置,以便随时加载并在生产环境中使用。

  • 多媒体文件管理与分析:在管理大量图片、音频、视频等多媒体文件的业务中,直接存储在数据库内会导致存储成本高、效率低。利用外部 Stage 和 DATALINK,可以将多媒体文件存储在外部系统,并通过 DATALINK 引用,实现文件的灵活存取。这对于需要动态访问大量文件、进行内容分析或媒体推荐的场景非常有用。

  • 日志和审计文件的长期存储与查询:日志数据和审计文件通常需要长期存储以满足合规需求,但直接存储在数据库中会导致占用大量空间。通过外部 Stage 和 DATALINK,将日志文件存储在外部系统中,并按需引用和查询,可以有效降低存储压力,提升查询效率,并满足审计需求。

  • 定期报告和数据备份:业务运营中,定期生成的报告和备份文件可以存储在外部存储上,通过 DATALINK 引用,便于访问与管理。这样不仅简化了数据备份和恢复操作,还为数据的历史追溯提供支持。

这些场景展示了外部 Stage 与 DATALINK 结合在数据管理中的灵活性和高效性。利用这种方法,企业能够以更低的成本实现对大数据文件的高效管理与访问,为数据处理和分析提供强大的支持。

示例

某电商平台每天生成大量订单数据,记录用户的购买情况、产品信息、付款状态等。为了提升销售预测、用户行为分析等,平台每天将订单数据保存为 CSV 文件,并上传到 MatrixOne 的外部 Stage,供数据分析和机器学习模型使用。

操作步骤

在 S3 上创建存储桶

在这里,我们以 AWS S3 为例,创建名为 orders-bucket 的存储桶,将每日生成的订单文件上传至 S3。

创建 Stage

首先,在 MatrixOne 中创建外部 Stage 指向 S3 上的数据存储位置。

create stage stage01 url = 's3://orders-bucket/test' credentials = {"aws_key_id"='xxxx',"aws_secret_key"='xxxx',"AWS_REGION"='us-west-2','PROVIDER'='Amazon', 'ENDPOINT'='s3.us-west-2.amazonaws.com'};

mysql> select * from stage_list('stage://stage01') as f;
+-----------------------------+
| file                        |
+-----------------------------+
| /test/orders_2023_11_06.csv |
+-----------------------------+
1 row in set (0.01 sec)

创建表管理数据集文件

创建一张 order_documents 表,用于记录 csv 文件的元数据,使用 DATALINK 字段来存储文件路径。DATALINK 使得文件存储和访问更加高效,可以在数据导入前先进行文件内容的检查和预处理,从而确保数据质量。此外,DATALINK 还支持多源数据的集成,使得跨系统的文件数据引用更加便捷,避免了将文件数据直接加载到数据库中,减少了存储压力并提高了数据处理的灵活性。

CREATE TABLE order_documents (
    document_id INT AUTO_INCREMENT,
    file_link DATALINK                     -- csv 文件链接
);

INSERT INTO order_documents (file_link) VALUES 
    ('stage://stage01/orders_2023_11_06.csv');

select document_id,load_file(file_link) from order_documents;
mysql> select document_id,load_file(file_link) from order_documents;
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| document_id | load_file(file_link)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|           1 | OrderID,UserID,ProductID,Quantity,TotalAmount,PaymentStatus,OrderDate
1001,123,2001,2,49.99,Completed,2023-11-06
1002,124,2002,1,19.99,Pending,2023-11-06
1003,125,2003,3,29.97,Completed,2023-11-06
1004,126,2001,1,24.99,Cancelled,2023-11-06
1005,127,2004,4,79.96,Completed,2023-11-06
1006,128,2005,2,39.98,Completed,2023-11-06
1007,129,2006,1,15.99,Pending,2023-11-06
1008,130,2002,2,39.98,Completed,2023-11-06
1009,131,2007,1,9.99,Completed,2023-11-06
1010,132,2008,5,49.95,Completed,2023-11-06

 |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

加载数据到表中

每日订单上传后,可以使用以下 SQL 语句,将数据加载到 MatrixOne 的订单表 orders 中,以便进一步分析和查询。

CREATE TABLE orders (
    OrderID INT,
    UserID INT,
    ProductID INT,
    Quantity INT,
    TotalAmount DECIMAL(10, 2),
    PaymentStatus VARCHAR(20),
    OrderDate DATE
);

mysql> load data infile 'stage://stage01/orders_2023_11_06.csv' into table orders fields terminated by ',' ignore 1 lines;
Query OK, 10 rows affected (0.56 sec)

mysql> select * from orders;
+---------+--------+-----------+----------+-------------+---------------+------------+
| orderid | userid | productid | quantity | totalamount | paymentstatus | orderdate  |
+---------+--------+-----------+----------+-------------+---------------+------------+
|    1001 |    123 |      2001 |        2 |       49.99 | Completed     | 2023-11-06 |
|    1002 |    124 |      2002 |        1 |       19.99 | Pending       | 2023-11-06 |
|    1003 |    125 |      2003 |        3 |       29.97 | Completed     | 2023-11-06 |
|    1004 |    126 |      2001 |        1 |       24.99 | Cancelled     | 2023-11-06 |
|    1005 |    127 |      2004 |        4 |       79.96 | Completed     | 2023-11-06 |
|    1006 |    128 |      2005 |        2 |       39.98 | Completed     | 2023-11-06 |
|    1007 |    129 |      2006 |        1 |       15.99 | Pending       | 2023-11-06 |
|    1008 |    130 |      2002 |        2 |       39.98 | Completed     | 2023-11-06 |
|    1009 |    131 |      2007 |        1 |        9.99 | Completed     | 2023-11-06 |
|    1010 |    132 |      2008 |        5 |       49.95 | Completed     | 2023-11-06 |
+---------+--------+-----------+----------+-------------+---------------+------------+
10 rows in set (0.01 sec)

卸载数据到 satge

假如商家需要将每日的订单数据从 orders 表导出到外部存储系统(如 AWS S3)以进行备份、共享或与合作伙伴共享数据。我们也可以通过将数据卸载到 stage 中实现。

--创建指向外部存储系统的 satge02
create stage stage02 url = 's3://order-share-bucket/' credentials = {"aws_key_id"='xxxx',"aws_secret_key"='xxxx',"AWS_REGION"='us-west-2','PROVIDER'='Amazon', 'ENDPOINT'='s3.us-west-2.amazonaws.com'};

--将 order 表中数据卸载到 satge02
select * from orders into outfile 'stage://stage02/order_share.csv';

--可以看到,数据卸载成功
mysql> select * from stage_list('stage://stage02') as f;
+------------------+
| file             |
+------------------+
| /order_share.csv |
+------------------+
1 row in set (0.01 sec)