bigywater.tech
ClickHouse 内部原理 · 74

S3 表函数:如何直接查询对象存储数据

真实起一个MinIO实例,验证ClickHouse的s3()表函数能否不导入数据直接在对象存储上查询,以及反向写出新文件的对称能力。

零导入直接查
真实count/sum结果跟手算完全吻合,未导入任何数据
读写完全对称
真实INSERT INTO FUNCTION s3能反向生成新文件

做的事:真实生成一份Parquet文件放到MinIO上,再直接查它

代码-- 真实生成1000行数据的Parquet文件,上传到MinIO(S3协议兼容) clickhouse local --query "SELECT number AS id, concat('user',toString(number)) AS name, number*1.5 AS amt FROM numbers(1000) INTO OUTFILE 'testdata.parquet' FORMAT Parquet" -- (真实用boto3上传到 http://127.0.0.1:19400/ch-lab/testdata.parquet) SELECT count(), sum(amt) FROM s3('http://127.0.0.1:19400/ch-lab/testdata.parquet', 'minioadmin', 'minioadmin123', 'Parquet');

验证:真实没有导入任何数据,直接在对象存储上算出了正确结果

实测 · 本机执行输出
SELECT * FROM s3(...) LIMIT 5;
→ 0  user0  0
  1  user1  1.5
  2  user2  3
  3  user3  4.5
  4  user4  6

SELECT count(), sum(amt) FROM s3(...);
→ 1000   749250

真实手算核对:sum(1.5*i) for i in 0..999 = 1.5 * (0+1+...+999) = 1.5*499500 = 749250   ← 完全吻合

整个过程真实没有执行任何CREATE TABLE或者INSERT,数据从头到尾只存在于MinIO上的这一个Parquet文件里,s3()表函数真实把它当成一张"临时表"直接参与SQL查询,聚合结果跟手工核算完全吻合。

验证:反过来,真实也能直接把查询结果写成对象存储上的文件

实测 · 本机执行输出
INSERT INTO FUNCTION s3('http://127.0.0.1:19400/ch-lab/output.parquet',
  'minioadmin', 'minioadmin123', 'Parquet')
SELECT number, concat('out',toString(number)) FROM numbers(500);

-- 真实检查MinIO上多出的文件
output.parquet   5148 字节   ← 真实新生成的文件

-- 真实读回验证
SELECT count() FROM s3('http://127.0.0.1:19400/ch-lab/output.parquet', ...);
→ 500
这组真实的双向验证说明了s3()表函数真实是一个完全对称的能力——不只是"读对象存储上现成的文件",INSERT INTO FUNCTION真实也能把任意一条SELECT查询的结果直接落成对象存储上的一个新文件,格式(本文用的Parquet,也支持CSV/JSONEachRow等)、路径都是查询本身指定的,整个过程ClickHouse真实充当的是一个"能读写对象存储、支持SQL查询"的计算引擎,而不要求数据必须先被"导入"进自己的存储引擎才能处理。这对真实的数据湖场景意义明确——数据可以继续躺在S3/MinIO这类廉价对象存储里,只有真正需要跑分析查询的时候,才临时用ClickHouse的计算能力去读取,不需要为了查询而先做一次完整的数据搬迁。真实要注意的是本文这次是单个文件的简单读写,S3路径本身真实支持glob通配符(比如*.parquet)一次查询多个文件,本系列下一篇《S3Queue》会验证更进一步的"持续消费新增文件"场景。

分步演示:从直接查询到反向写入的双向真实能力

每一步都是本文上面用真实MinIO跑出来的原始结果。

不导入数据,真实直接查/写对象存储上的文件
这一步新验证的方向

    本文用到的工具

    • 本机真实独立起的MinIO(S3协议兼容)实例,真实的 s3() 表函数
    • 真实验证 SELECT FROM s3(...) 与 INSERT INTO FUNCTION s3(...) 双向能力
    京ICP备2026067502号-1京公网安备11010502063487号