文件接入

文件接入是指将现有的文本数据文件导入到目标数据表。文本文件通常是 CSV 格式。

创建 CSV 文件:

$ vi rows.csv

测试 CSV 文件格式如下,第一行为字段名,后面是数据行,3 列的类型分别为时间戳、整型和字符串:

time,c1,c2
2021-01-01 00:00:00,1,a1
2021-01-01 00:00:00,2,a2
2021-01-01 00:00:00,3,a3

目标库为 test,目标表 dest 的模式(Schema)如下,与 CSV 文件格式一致:

=# CREATE TABLE dest(
    time timestamp,
    c1 int,
    c2 text
)USING MARS3
 DISTRIBUTED BY(c1)
 ORDER BY(time,c1);

下面介绍几种常用的方法将文件内容导入到目标表中:


1. COPY

COPY是 YMatrix 自带的 SQL 命令,可以将在主节点(Master)的数据文件导入到目标表中。

首先使用 psql 连接到目标库,再执行 COPY 命令。

[mxadmin@mdw ~]$ psql test
psql (12)
Type "help" for help.

test=# COPY dest FROM '/home/mxadmin/rows.csv' DELIMITER ',' HEADER;
COPY 3

DELIMITER 参数指定了分隔符;HEADER 的含义是导入数据时要过滤文件头。

COPY 的方式比较简单,但存在如下问题:

  • 数据文件必须在 Master 节点上
  • 数据通过 Master 插入,和批量 INSERT 效果一样,当数据量大时有性能问题

2. MatrixGate

MatrixGate 方式是使用 YMatrix 提供的高速数据接入工具 mxgate 进行数据导入。

COPY 相比,mxgate 在数据量大的时候性能更好,并且数据文件和 Master 也可以分开部署。

$ tail -n +2 rows.csv | mxgate --source stdin --db-database test --db-master-host localhost --db-master-port 5432 --db-user mxadmin --time-format raw --target public.dest --parallel 2 --delimiter ',' 

上述命令通过管道方式,将 rows.csv 的数据部分重定向到了 mxgate。mxgate 以 stdin 的方式接入数据到 test 库的 dest 表中。

注意!
因为 mxgate 进行数据接入时不需要文件头,所以使用 tail -n +2 命令,从第二行进行输出。

更多的 mxgate 使用方法请参考文档