有时我们需要快速查询分析文件数据,正常流程需要在数据库中创建表,然后利用工具或编码导入数据,这时才能在数据库中查询分析。利用ClickHouse文件引擎可以快速查询文件数据。本文首先介绍ClickHouse文件引擎,然后介绍如何快速实现查询数据文件的方案。
ClickHouse 文件引擎
文件表引擎在文件中保存数据,支持的数据格式有:CSV, JSON, XML 等,详细内容可参考官网文档。
典型应用场景为:
- 从ClickHouse导出数据至文件
- 对数据进行格式转换
- 通过编辑文件更新ClickHouse表数据
File表引擎用法
语法如下:
sql
File(Format)
Format 参数制定一种有效的文件格式。为了执行select 查询,格式必须支持输入格式,同样为了insert查询,需支持输出。支持的格式类型可参考官网文档。大部分格式同时支持输入和输出格式,但部分格式仅支持其中之一,如 MySQLDump 仅支持输入,不支持输出。
ClickHouse 不允许指定文件路径,因为文件路径是在服务端配置文件path参数指定。
当实用上面语法创建表时,则会在指定文件夹中创建空的子目录。写入数据时,会在子目录中生成data.Format文件。我们可以在服务端文件系统中手动创建该子目录,然后ATTACH命令链接表信息,也可以从文件中查询数据。但不建议采用该方式,因为ClickHouse不跟踪外部数据变化。
举例
创建 表:file_engine_table,格式为TabSeparated,即数据用tab分隔,就是tsv文件格式。
sql
CREATE TABLE file_engine_table (name String, value UInt32) ENGINE=File(TabSeparated)
ClickHouse 缺省在该目录下创建子目录: /var/lib/clickhouse/data/default/file_engine_table
.
下面手动创建数据文件 /var/lib/clickhouse/data/default/file_engine_table/data.TabSeparated
:
shell
$ cat data.TabSeparated
one 1
two 2
查询数据
sql
SELECT * FROM file_engine_table
┌─name─┬─value─┐
│ one │ 1 │
│ two │ 2 │
└──────┴───────┘
ClickHouse-local工具用法
在clickhouse-local工具,文件引擎除了文件格式参数,还可以指定文件路径参数。默认输入/输出流可以使用数字或人类可读的名称来指定,例如0或stdin, 1或stdout。可以根据附加的引擎参数或文件扩展名(gz、br或xz)读写压缩文件。
shell
$ 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
- Indices
- Replication
关于默认设置
- engine_file_empty_if_not_exists - allows to select empty data from a file that doesn't exist. Disabled by default.
- engine_file_truncate_on_insert - allows to truncate file before insert into it. Disabled by default.
- engine_file_allow_create_multiple_files - allows to create a new file on each insert if format has suffix. Disabled by default.
- engine_file_skip_empty_files - allows to skip empty files while reading. Disabled by default.
- storage_file_read_method - method of reading data from storage file, one of:
read
,pread
,mmap
. The mmap method does not apply to clickhouse-server (it's intended for clickhouse-local). Default value:pread
for clickhouse-server,mmap
for clickhouse-local.
上传文件直接分析
通过上节内容,我们指定文件表引擎就是在固定路径下创建子目录,然后在该子目录中创建对应文件(插入数据)。我们的需求是快速查询分析数据文件,如csv文件,用户上传完就可以分析。
实现步骤:
-
需要一些参数,如表名称和描述(英文名和中文名),
-
用户上传csv文件
- 解析csv文件(读取第一行作为字段名称,最好为英文命名,读取第二行数据判断数据类型),如果没有标题行,则自动命名为F1,F2...
- 使用文件表引擎语法创建表,引用上一步中的参数信息
- 在元数据中插入表和字段信息,用于自助查询分析场景
- 在该表中插入csv文件数据,动态生成insert语句。
-
查询该表,也可以执行一些统计查询语句。
总结
本文介绍了ClickHouse文件引擎的概念和使用方法。利用文件引擎我们快速实现对数据文件的查询统计分析。