JQuick-SQL NoSQL 数据接入:先标准化文档记录,再统一 SQL 查询
Meta 描述:说明如何将 NoSQL 查询结果在应用层或 jquick-connector 中映射为 JQuickRow/JQuickDataSet,再注册到 jquick-sql 进行统一分析。
标签:jquick-sql、NoSQL、文档数据库、异构数据源联邦查询、Java 跨库查询、JQuickRow、轻量级 SQL 引擎
官网示例:
- FORMULAS 示例页:https://www.jquick.org/jquick-sql
- github 地址:https://github.com/paohaijiao/jquick-sql
前言
NoSQL 系统通常以文档、键值或宽表形式保存业务数据,字段可能不完全一致。jquick-sql 不直接提供 MongoDB、Redis、Elasticsearch 或其他 NoSQL 的原生连接能力;它适合承接应用层已经读取并结构化后的数据集,用 SQL 完成后续关联与聚合。
先把半结构化记录变成稳定列
应用层或 jquick-connector 应先选择分析所需字段,对嵌套对象进行展开,对缺失字段赋予一致语义,再构建 JQuickRow。同时用 JQuickColumnMeta 明确列名、Java 类型和来源标识。
例如,订单文档中的 customer.id 可以展开为 customer_id,金额转为数值类型,创建时间统一为项目规定的日期类型。不要把不稳定 JSON 字符串直接当作所有分析字段的替代品。
维度关联与口径治理
NoSQL 数据注册后可与来自其他系统的已注册表关联,例如将文档订单与客户主数据 JOIN。关联前必须统一业务键:字符串 ID、数值 ID 或复合键不应混用;编码、地区和状态字段也应建立映射表。
这种方式实现的是应用内异构数据源联邦查询。数据采集、分页、限流和权限控制仍在外部接入层,jquick-sql 不会直接向 NoSQL 服务发请求。
性能与刷新策略
建议只读取必要字段和时间窗口,并在注册前过滤掉明显无效的数据。对于高频变化集合,可采用增量拉取后重建当前查询窗口;对于较稳定的维度,可独立缓存并按计划刷新。
由于执行面向进程内数据集,容量规划应覆盖 Java 堆内存、单次查询范围和并行执行需求。先从可控批量开始,再根据实际观测调整。
代码案例
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 NoSqlDataSourceDemo {
public static void main(String[] args) {
// documentRows 代表应用层或 jquick-connector 已读取、展平和类型转换的 NoSQL 结果。
List<JQuickRow> documentRows = Arrays.asList(
row("customer_id", "C100", "status", "PAID", "amount", 680.0),
row("customer_id", "C200", "status", "PENDING", "amount", 120.0),
row("customer_id", "C100", "status", "PAID", "amount", 260.0)
);
JQuickSQL sql = JQuickSQL.embedded();
try {
sql.registerTable("nosql_orders", Arrays.asList(
new JQuickColumnMeta("customer_id", String.class, "nosql_orders"),
new JQuickColumnMeta("status", String.class, "nosql_orders"),
new JQuickColumnMeta("amount", Double.class, "nosql_orders")
), documentRows);
JQuickDataSet result = sql.execute(
"SELECT customer_id, SUM(amount) AS paid_amount " +
"FROM nosql_orders WHERE status = 'PAID' " +
"GROUP BY customer_id ORDER BY paid_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 是否提供 MongoDB Connector?**不提供。请在应用层或 jquick-connector 获取数据并转换后注册。
**嵌套字段如何查询?**应在接入阶段展开为稳定列,或先将复杂字段按业务需求规范化。
**可以与关系库数据 JOIN 吗?**可以,但两边都要先转换为 JQuickDataSet 并调用 registerTable。
总结与拓展
NoSQL 接入的核心是"先标准化、后查询"。将文档结构转为稳定的行列模型后,jquick-sql 就能作为 Java 分布式 SQL 查询引擎承接跨系统的筛选、聚合和关联需求,同时保持外部连接责任清晰。
Core Advantage
Provides SQL over normalized NoSQL extracts while preserving the application's ownership of connectivity and schema mapping.
Applicable Scenarios
Document-order analytics, event snapshots, customer profiles, cache exports, and cross-system operational reporting.