JQuick-SQL CSV 文件数据接入:转换为内存表后再查询
Meta 描述:学习将 CSV 在应用层或 jquick-connector 中解析为 JQuickRow/JQuickDataSet,再通过 registerTable 交给 jquick-sql 执行 SQL 分析。
标签:jquick-sql、CSV 文件、JQuickDataSet、异构数据源联邦查询、轻量级 SQL 引擎、Java 跨库查询、文件数据分析
官网示例:
- FORMULAS 示例页:https://www.jquick.org/jquick-sql
- github 地址:https://github.com/paohaijiao/jquick-sql
前言
CSV 常用于财务导出、门店日报和第三方批量交换。jquick-sql 可查询已经注册的 CSV 结果集,但它本身不提供 CSV 文件读取或解析 API。推荐由应用层或 jquick-connector 完成文件读取、表头校验、编码处理和类型映射,再将记录注册到引擎。
CSV 接入的标准流程
流程可概括为:定位文件、使用应用选定的 CSV 解析库读取、校验必填列、转换日期和数值、生成 JQuickRow、定义 JQuickColumnMeta、调用 registerTable。最后由 jquick-sql 使用 SQL 处理分组、筛选和关联。
将文件解析职责留在应用层,可根据企业现有规范处理 UTF-8、GBK、引号转义、异常行和数据血缘;这些都不是 jquick-sql 的原生连接器功能。
字段类型与数据质量
CSV 中的值天然是文本,必须在转换阶段明确类型。金额建议使用团队既定的精度策略,日期应统一格式,业务编码应避免被解析为数字后丢失前导零。空字符串与 null 的业务含义也要预先约定。
对于不可信文件,可先记录行号、错误原因和丢弃策略。只有通过校验的数据再注册,能让 SQL 查询结果更可审计。
与业务库数据关联
文件数据可注册为 csv_sales,业务库数据经应用层读取后注册为 products 或 stores,然后在 jquick-sql 中 JOIN。这里的异构数据源联邦查询是对两张已注册内存表的统一计算,不是引擎直接打开 CSV 或连接数据库。
控制注册数据规模尤其重要:按日期、区域或批次切片通常比一次性加载全部历史文件更稳妥。
代码案例
java
import com.github.paohaijiao.engine.JQuickSQL;
import com.github.paohaijiao.statement.JQuickColumnMeta;
import com.github.paohaijiao.statement.JQuickDataSet;
import com.github.paohaijiao.statement.JQuickRow;
import java.util.Arrays;
import java.util.List;
public class CsvDataSourceDemo {
public static void main(String[] args) {
// csvRows 应由应用层或 jquick-connector 解析 CSV 后构造;
// jquick-sql 不直接提供 CSV 读取 API。
List<JQuickRow> csvRows = Arrays.asList(
row("store_code", "S001", "amount", 120.5),
row("store_code", "S002", "amount", 95.0),
row("store_code", "S001", "amount", 80.0)
);
JQuickSQL sql = JQuickSQL.embedded();
try {
sql.registerTable("csv_sales", Arrays.asList(
new JQuickColumnMeta("store_code", String.class, "csv_sales"),
new JQuickColumnMeta("amount", Double.class, "csv_sales")
), csvRows);
JQuickDataSet result = sql.execute(
"SELECT store_code, SUM(amount) AS total_amount " +
"FROM csv_sales GROUP BY store_code ORDER BY total_amount DESC"
);
result.printTable();
} finally {
sql.shutdown();
}
}
private static JQuickRow row(Object... values) {
JQuickRow row = new JQuickRow();
for (int i = 0; i < values.length; i += 2) row.put((String) values[i], values[i + 1]);
return row;
}
}
常见问题
**jquick-sql 能直接传入 CSV 路径吗?**不能。请先在应用层或 jquick-connector 读取并转换为 JQuickRow / JQuickDataSet。
**CSV 金额为什么不能一直用 String?**字符串会影响聚合和比较语义,应在接入层映射为适当的数值类型。
**能把多个 CSV 文件合并分析吗?**可以。分别解析后注册为表,或先在应用层统一为一个数据集。
总结与拓展
CSV 场景的价值在于快速承接离线业务数据。应用层负责文件质量和类型标准化,jquick-sql 负责 SQL 分析,这种分工能帮助中小企业以较轻的方式建立文件与业务数据之间的查询能力。
Core Advantage
Turns validated file rows into a consistent in-memory SQL surface without inventing a file connector.
Applicable Scenarios
Daily exports, financial reconciliation files, store reports, third-party batch data, and temporary data analysis.