SPL 轻量级多源混算实践 4 - 查询 MongoDB

article/2025/7/20 4:12:25

除了以上常见数据源,还有 NoSQL、MQ 等数据源,其中以 MongoDB 最为常用。我们用 SPL 连接 MongoDB 做计算。

导入 MongoDB 数据。

外部库

SPL 支持的多种数据源大概分两类,一类是像 RDB 有 JDBC 直接使用,或者文件等直接读取;另一类是像 MongoDB 等非关系数据源是在官方驱动上进行了简单封装,具体以“外部库”的形式提供。

外部库列表包括以下数十种非常规数据源及函数:

..

外部连接器放在外部库中,外部库是 SPL 提供的外部函数扩展库,将一些在普遍场景使用频率不高的专门用途函数以外部库形式提交,这样可以根据需要临时加载。

外部数据源种类繁多,也不是每种数据源都很常用,所以将这些连接器以外部库的形式提供会更为灵活,以后发现有新的数据源也可以及时补充而不影响现有的数据源。

具体使用时,需要先下载外部库驱动:https://download.raqsoft.com.cn/esproc/ext/extlib/extlib-20250508.zip

然后放置到任意目录,比如 [安装目录] \esProc\extlib。接着在 IDE 中加载外部库目录,并勾选要用到的外部库。

..

..

计算用例

Orders 集合存储了订单相关信息,其结构和内容如下:

{"_id": {"$oid": "6826ade0cbc0428d8335b0bb"},"order_id": "ORD1001","customer": "C001","order_date": {"$date": "2025-01-15T00:00:00.000Z"},"order_details": [{"product_id": "P001","product_name": "Laptop","quantity": 1,"price": 899.99},{"product_id": "P005","product_name": "Wireless Mouse","quantity": 2,"price": 19.99}]
}

现在要查询:orders 集合中订单金额前 3 的客户

SPL 脚本:

A
1=mongo_open("mongodb://127.0.0.1:27017/raqdb")
2=mongo_shell@d(A1,"{'find':'orders'}")
3=A2.groups(customer; order_details.sum(quantity*price):amount)
4=A3.top(3,-amount)

A1:连接 MongoDB

A2:查询 orders 数据,@d 表示返回成序表。

..

这是一个多层结构,其中一个 order_details 展开,与之前处理的 JSON 结构是类似的。

..

A2 执行的命令完全是 MongoDB 的原生语法,我们在 MongoShell 中执行看:

..

成功返回了游标。取出 1 条看看:

..

A3:按客户分组汇总订单金额,后续的计算就都一样了。

A4:使用 top 函数取前 3 大客户

我们再做个过滤,查询 2025-02-01 之前的订单

A2 改成:

=mongo_shell@d(A1,"{'find':'orders',filter: {order_date: { $lt: new ISODate('2025-02-01T00:00:00Z') } }}")

运行结果:

..

在 MongoDB 中执行同样的命令,可以得到相同的结果。

..

这里以 MongoDB 来举例说明 SPL 连接特殊数据源时的处理方式。其他数据源也是类似配置外部库,然后使用对应的原生语法访问即可。

比如读取 Kafka 数据:

A
1=kafka_open("/kafka/my.properties", "topic1")
2=kafka_poll(A1)
3=A2.derive(json(value):v).new(key, v.fruit, v.weight)
4=kafka_close(A1)

访问 Elasticsearch:

A
1>apikey="Authorization:ApiKey a2x6aEF……KZ29rT2hoQQ=="
2'{"counter": 1,"tags": ["red"] ,"beginTime":"2022-01-03","endTime":"2022-02-15"}
3=es_rest("https://localhost:9200/index1/_doc/1", "PUT",A2;"Content-Type: application/x-ndjson",apikey)
4=json(A3.Content)

访问 HDFS:

A
1=hdfs_open("hdfs://192.168.0.8:9000", "root")
2=hdfs_file(A1,"/user/root/orders.txt":"UTF-8")
3=A2.read()
4=A2.import@t()

SPL 这种 Native 接口 + 简单封装的方式简单方便,可以保留数据源的特点,充分利用其存储和计算能力,不需要先把数据做“某种”入库动作,实时访问就可以;用户想要扩展也不难。但读数是写在 SPL 脚本里的,而且使用了原生接口,这就意味着如果数据源变化时还要修改脚本,没法做到像逻辑数仓那样对底层数据源完全透明。

逻辑数仓的数据源接入依赖的专用连接器,可以做到完全对底层透明。但连接器要针对每种数据源单独开发,复杂度很高,导致可用 Connector 数量明显不多,用户自行基于开源代码再开发的难度也很大,往往要等厂商支持。

逻辑数仓专用 Connector 和 SPL 使用 Native 接口简单封装没有好坏之分,前者可以做更深层次的支持和优化,可以做到一定程度的透明化;后者则更加灵活,支持的数据源丰富且扩展灵活,要根据具体需要选择。

至此我们已经学会了用 SPL 查询数据库、CSV/XLS、Restful/JSON、MongoDB,这些数据接入后都可以进行混合计算了。

esProc SPL是开源免费的,下载试用~


http://www.hkcw.cn/article/xocppQVBpn.shtml

相关文章

特别篇-产品经理(三)

一、市场与竞品分析—竞品分析 1. 课后总结 案例框架:通过"小新吃蛋糕"案例展示行业分析方法,包含四个关键步骤: 明确目标行业调研确定竞品分析竞争策略输出结论 1)行业背景分析方法 PEST分析法:从四个…

Photoshop使用钢笔绘制图形

1、绘制脸部路径 选择钢笔工具,再选择“路径”。 基于两个点绘制一个弯曲的曲线 使用Alt键移动单个点,该点决定了后续的曲线方向 继续绘制第3个点 最后一个点首尾是同一个点,使用钢笔保证是闭合回路。 以同样的方式绘制2个眼睛外框。 使用椭…

EMQX社区版5.8.5集群搭建踩坑记

一、首先要在三台物理机上分别搭建EMQX的实例 正常的安装是很简单的,并且有多种方式,我选取的是tar.gz安装包。 只需要把安装包解压tar -zxvf emqx-5.8.5xxx.tar.gz,然后进入到bin目录下,执行./emqx start即可。 1. 需要考虑操作…

长短期记忆(LSTM)网络模型

一、概述 长短期记忆(Long Short-Term Memory,LSTM)网络是一种特殊的循环神经网络(RNN),专门设计用于解决传统 RNN 在处理长序列数据时面临的梯度消失 / 爆炸问题,能够有效捕捉长距离依赖关系。…

t014-项目申报管理系统 【springBoot 含源码】

项目演示视频 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,项目信息因为其管理内容繁杂,管理数量繁多导致手工进行…

软件评测机构如何保障质量?检测资质、技术实力缺一不可

软件评测机构在保障软件质量上起着关键作用,对软件行业的健康发展极为关键。它们采用专业的技术手段和严格的评估流程,对软件的运行效果、功能等多方面进行细致的审查,为开发者和使用者提供了客观、公正的参考依据。 检测资质正规软件评测机…

安卓逆向篇JEB 反编译断点动态调试加密算法还原逻辑会员绕过

#APK 逆向 - 反编译 & 动态调试 -Jeb&Adb 0 、模拟器开发者模式 - 启用开发者模式(快速单击 5 次关于平板电脑版本) - 系统 - 高级 - 开发者选项 - 启用 USB 调试模式 - 模拟器设置里面开启 root 及磁盘共享可写入 0 、 Jeb 环境配…

【传感器技术】电感式传感器,变磁阻式传感器。互感式传感器,电涡流式传感器

一、磁路 线圈通入电流后,产生磁通,分主磁通和漏磁通。 二、磁路的欧姆定律 对于环形线圈 磁路与电路对照 磁路的计算 在计算电机、电器等的磁路时,要预先给定铁心中的磁通(或磁感应强度),而后按照所给的…

UE利用RenderTaget在UI上渲染目标

创建RenderTaget2D 创建 半透明 用户界面 材质 , 透明度用1- 反转一下 创建WBP 把材质放进Image 创建Actor蓝图 添加摄像机 和 SceneCaptureComponent 场景捕获组件2D SceneCaptureComponent2D 可以选择排除不捕获的物体 关卡蓝图中 创建UI 把Actor拖入场景 就能显示了 运行…

如何使用windows下的vscode连接到本地虚拟机的linux

1.打开windows下的vscode 下载下图所示插件 下载完以后打开首选项选择设置搜索ssh 搜索ssh往下滑对下图打上勾 点击下图或者按ctrl shift P 搜索ssh 选择第一个,双击后 进入这个界面 好的window基本配置差不多 2.打开虚拟机 在终端中输入 sudo apt-get install…

STM32 搭配 嵌入式SD卡在智能皮电手环中的应用全景评测

在智能皮电手环及数据存储技术不断迭代的当下,主控 MCU STM32H750 与存储 SD NAND MKDV4GIL-AST 的强强联合,正引领行业进入全新发展阶段。二者凭借低功耗、高速读写与卓越稳定性的深度融合,以及高容量低成本的突出优势,成为大规模…

国产突破:OLI-P白光干涉技术开启保偏光纤高精度检测新时代

在高速光通信与精密传感领域,保偏光纤的偏振稳定性是系统性能的“生命线”。然而,传统检测手段受限于灵敏度低、无法实现分布式测量,难以捕捉微弱的偏振耦合信号,导致隐性缺陷成为行业检测痛点。OLI-P偏振串扰分析仪,以…

多模态大语言模型arxiv论文略读(100)

Data Processing Techniques for Modern Multimodal Models ➡️ 论文标题:Data Processing Techniques for Modern Multimodal Models ➡️ 论文作者:Yinheng Li, Han Ding, Hang Chen ➡️ 研究机构: Columbia University、New York University ➡️ …

Idea 配置 Maven 环境

下载 Maven 官网:https://maven.apache.org/index.html 点击左侧 Downloads,然后选择 Files 中的 zip 包下载(下载慢可以使用迅雷) 配置 Maven 将压缩包解压,比如我解压后放到了 D:\developer\environment\apache-…

OpenWebUI(1)源码学习构建

1. 前言 通过docker镜像拉取安装就不介绍了,官方的命令很多。本节主要撸一撸源码,所以,本地构建 2. 技术框架和启动环境 后端python,前端svelte 环境要求:python > 3.11 ,Node.js > 20.10 3. 源…

基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

Idea使用springAI搭建MCP项目

一、demo项目搭建 1、官方初始化项目下载 https://start.spring.io/ 2、解压下载好的压缩包 3、使用Idea打开项目 4、查看阿里云百炼api-key https://bailian.console.aliyun.com/?tabmodel#/api-key 5、配置到项目中 spring.ai.openai.api-keysk-xxxxxxxxxxxxxxxxxxxxxxx…

Deepseek系列之deepseek-v1

关于deepseek的系列模型,断断续续也看了相关paper,之前也做了部分记录但是一直没发出来,最近打算梳理下deepseek的系列模型,有个系统性的认识,后续可能再补个千问系列,部分细节持续更新~ Deepseek相关模型 …

AI生态警报:MCP协议风险与应对指南(上)——架构与供应链风险

MCP(Model Context Protocol,模型上下文协议)是一种为应用程序提供向大语言模型(LLM)传递上下文的统一协议。随着MCP协议成为AI生态的核心枢纽,其安全风险已从理论威胁转化为实际攻击目标。 MCP协议&#x…

PyQt6基础_QtCharts绘制横向柱状图

前置: pip install PyQt6-Charts 结果: 代码: import sysfrom PyQt6.QtCharts import (QBarCategoryAxis, QBarSet, QChart,QChartView, QValueAxis,QHorizontalBarSeries) from PyQt6.QtCore import Qt,QSize from PyQt6.QtGui import QP…