ClickHouse导入CSV报错78:含INFILE的查询直接发送至服务器
解决ClickHouse INSERT FROM INFILE报错问题
错误原因
你遇到的UNKNOWN_TYPE_OF_QUERY错误,核心原因是**FROM INFILE语法仅支持在clickhouse-client命令行工具中使用**,而你是通过HTTP客户端(比如JDBC、GUI工具)直接向服务器发送这条语句,HTTP接口不支持这种客户端读取本地文件并上传的语法。
解决方案
方案1:使用clickhouse-client命令行执行
直接在终端运行命令:
clickhouse-client --query "INSERT INTO default.tags FROM INFILE '/home/sergey/test/tags_202309081557.csv' FORMAT CSV;"
或者进入clickhouse-client交互模式后执行SQL:
INSERT INTO default.tags FROM INFILE '/home/sergey/test/tags_202309081557.csv' FORMAT CSV;
方案2:通过HTTP接口上传文件(适用于JDBC/GUI场景)
如果必须使用HTTP类客户端,需要通过POST请求直接上传文件内容,而不是使用FROM INFILE语法。例如用curl命令:
curl -X POST 'http://localhost:8123/?query=INSERT%20INTO%20default.tags%20FORMAT%20CSV' --data-binary @/home/sergey/test/tags_202309081557.csv
如果是JDBC代码,需通过PreparedStatement的setBinaryStream方法将文件内容流式上传,示例伪代码:
String sql = "INSERT INTO default.tags FORMAT CSV"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setBinaryStream(1, new FileInputStream("/home/sergey/test/tags_202309081557.csv")); stmt.execute();
额外注意事项
如果你的CSV文件在ClickHouse服务器本地(而非客户端机器),可开启服务器读取本地文件的权限后操作,但仍需在clickhouse-client中执行:
SET allow_local_infile = 1; INSERT INTO default.tags FROM INFILE '/home/sergey/test/tags_202309081557.csv' FORMAT CSV;
注意:开启allow_local_infile存在安全风险,需谨慎使用。
内容的提问来源于stack exchange,提问作者Sergey Lebedev
相关产品推荐
相关产品推荐

