文件表引擎
文件表引擎将数据存储在一个文件中,并使用支持的文件格式(TabSeparated
、Native
等)。
使用场景
- 将数据从 ClickHouse 导出到文件。
- 将数据从一种格式转换为另一种格式。
- 通过编辑磁盘上的文件来更新 ClickHouse 中的数据。
此引擎当前在 ClickHouse Cloud 中不可用,请改用 S3 表函数。
在 ClickHouse 服务器中使用
File(Format)
Format
参数指定可用文件格式之一。要执行 SELECT
查询,该格式必须支持输入,要执行 INSERT
查询,则必须支持输出。可用格式列在格式部分。
ClickHouse 不允许为 File
指定文件系统路径。它将使用服务器配置中 path 设置定义的文件夹。
使用 File(Format)
创建表时,它会在该文件夹中创建一个空的子目录。当数据写入该表时,它会被放入该子目录中的 data.Format
文件中。
您可以手动在服务器文件系统中创建此子文件夹和文件,然后附加到名称匹配的表信息,以便您可以查询该文件中的数据。
请谨慎使用此功能,因为 ClickHouse 不会跟踪对这些文件的外部更改。通过 ClickHouse 和 ClickHouse 外部同时写入的结果是未定义的。
示例
1. 设置 file_engine_table
表
CREATE TABLE file_engine_table (name String, value UInt32) ENGINE=File(TabSeparated)
默认情况下,ClickHouse 将创建文件夹 /var/lib/clickhouse/data/default/file_engine_table
。
2. 手动创建包含以下内容的 /var/lib/clickhouse/data/default/file_engine_table/data.TabSeparated
文件
$ cat data.TabSeparated
one 1
two 2
3. 查询数据
SELECT * FROM file_engine_table
┌─name─┬─value─┐
│ one │ 1 │
│ two │ 2 │
└──────┴───────┘
在 ClickHouse-local 中使用
在clickhouse-local 中,File 引擎除了 Format
之外还接受文件路径。默认输入/输出流可以使用数字或人类可读的名称指定,例如 0
或 stdin
、1
或 stdout
。可以根据额外的引擎参数或文件扩展名(gz
、br
或 xz
)读取和写入压缩文件。
示例
$ echo -e "1,2\n3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); SELECT a, b FROM table; DROP TABLE table"
实现细节
- 可以并发执行多个
SELECT
查询,但INSERT
查询将互相等待。 - 支持通过
INSERT
查询创建新文件。 - 如果文件存在,
INSERT
将在其中追加新值。 - 不支持
ALTER
SELECT ... SAMPLE
- 索引
- 复制
PARTITION BY
PARTITION BY
— 可选。可以通过对分区键进行数据分区来创建单独的文件。在大多数情况下,您不需要分区键,如果需要,通常不需要比按月更细粒度的分区键。分区不会加快查询速度(与 ORDER BY 表达式相反)。您不应该使用过细的分区。不要按客户端标识符或名称对数据进行分区(而是将客户端标识符或名称作为 ORDER BY 表达式中的第一列)。
要按月进行分区,请使用 toYYYYMM(date_column)
表达式,其中 date_column
是一个包含日期类型的列Date。此处分区名称采用 "YYYYMM"
格式。
虚拟列
_path
— 文件路径。类型:LowCardinality(String)
。_file
— 文件名。类型:LowCardinality(String)
。_size
— 文件大小(以字节为单位)。类型:Nullable(UInt64)
。如果大小未知,则值为NULL
。_time
— 文件上次修改时间。类型:Nullable(DateTime)
。如果时间未知,则值为NULL
。
设置
- engine_file_empty_if_not_exists - 允许从不存在的文件中选择空数据。默认情况下禁用。
- engine_file_truncate_on_insert - 允许在插入数据之前截断文件。默认情况下禁用。
- engine_file_allow_create_multiple_files - 如果格式有后缀,则允许在每次插入时创建一个新文件。默认情况下禁用。
- engine_file_skip_empty_files - 允许在读取时跳过空文件。默认情况下禁用。
- storage_file_read_method - 从存储文件读取数据的方法,可以是:
read
、pread
、mmap
。mmap 方法不适用于 clickhouse-server(它适用于 clickhouse-local)。默认值:clickhouse-server 为pread
,clickhouse-local 为mmap
。