跳至主要内容

查询处理的外部数据

ClickHouse 允许在处理查询时向服务器发送所需的数据,以及一个 SELECT 查询。这些数据将被放入一个临时表中(参见“临时表”部分),并在查询中使用(例如,在 IN 操作符中)。

例如,如果您有一个包含重要用户标识符的文本文件,您可以将其上传到服务器,并使用该列表进行过滤的查询一起上传。

如果您需要使用大量外部数据运行多个查询,请不要使用此功能。最好提前将数据上传到数据库。

可以使用命令行客户端(非交互模式)或 HTTP 接口上传外部数据。

在命令行客户端中,您可以按以下格式指定参数部分

--external --file=... [--name=...] [--format=...] [--types=...|--structure=...]

您可以根据要传输的表数量,创建多个这样的部分。

–external – 标记一个子句的开头。–file – 包含表转储的文件路径,或 -,表示标准输入。标准输入只能检索一个表。

以下参数是可选的:–name – 表的名称。如果省略,则使用 _data。–format – 文件中的数据格式。如果省略,则使用 TabSeparated。

以下参数之一是必需的:–types – 逗号分隔的列类型列表。例如:UInt64,String。列将被命名为 _1, _2, ... –structure – 表结构,格式为UserID UInt64, URL String。定义列名和类型。

在“file”中指定的文件将使用“format”中指定的格式进行解析,使用“types”或“structure”中指定的数据类型。该表将被上传到服务器,并在服务器上以“name”中的名称作为临时表访问。

示例

$ echo -ne "1\n2\n3\n" | clickhouse-client --query="SELECT count() FROM test.visits WHERE TraficSourceID IN _data" --external --file=- --types=Int8
849897
$ cat /etc/passwd | sed 's/:/\t/g' | clickhouse-client --query="SELECT shell, count() AS c FROM passwd GROUP BY shell ORDER BY c DESC" --external --file=- --name=passwd --structure='login String, unused String, uid UInt16, gid UInt16, comment String, home String, shell String'
/bin/sh 20
/bin/false 5
/bin/bash 4
/usr/sbin/nologin 1
/bin/sync 1

使用 HTTP 接口时,外部数据将以 multipart/form-data 格式传递。每个表都作为一个单独的文件进行传输。表名将从文件名中获取。query_string 将传递参数 name_format, name_typesname_structure,其中 name 是这些参数所对应的表的名称。这些参数的含义与使用命令行客户端时的含义相同。

示例

$ cat /etc/passwd | sed 's/:/\t/g' > passwd.tsv

$ curl -F '[email protected];' 'https://127.0.0.1:8123/?query=SELECT+shell,+count()+AS+c+FROM+passwd+GROUP+BY+shell+ORDER+BY+c+DESC&passwd_structure=login+String,+unused+String,+uid+UInt16,+gid+UInt16,+comment+String,+home+String,+shell+String'
/bin/sh 20
/bin/false 5
/bin/bash 4
/usr/sbin/nologin 1
/bin/sync 1

对于分布式查询处理,临时表将被发送到所有远程服务器。