关注【索引目录】服务号,更多精彩内容等你来探索!
还有一些其他常见的数据源,包括 NoSQL、MQ、MongoDB 等等,其中最常用的是 MongoDB。现在让我们使用 SPL 连接 MongoDB 进行计算。
从 MongoDB 导入数据。
外部库
SPL 支持的数据源大致可以分为两类。一类是关系型数据库(RDB),可以通过 JDBC 访问;二类是文件,可以直接从中获取数据。另一类是非关系型数据源,例如 MongoDB,SPL 只是基于其官方驱动 jar 包对它们进行了简单的封装,并以外部库的形式提供。
SPL外部库包含数十个非关系数据源和函数:
外部连接器放置在外部库中,外部库是外部函数扩展库。将一些在处理常见计算问题时不常用的专用函数以外部库的形式提交,供用户在需要时随时调用。
外部数据源种类繁多,并非所有数据源都经常使用。以外部库的形式提供这些外部连接器更加灵活,允许将新的数据源添加到库中,而不会影响现有的数据源。
要使用外部库,首先需要下载外部库驱动程序。
将驱动放在任意目录下,例如[安装目录]\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
}
]
}
查找订单金额排名前3的客户。
SPL脚本:
A1:连接到 MongoDB。
A2:查询订单数据。@d 表示以序表形式返回结果。
这是一个多级结果集,其中 order_details 可以扩展,类似上面实践中处理的 JSON 数据。
A2 执行了一条纯 MongoDB 原生语法的命令。现在在 MongoDB Shell 上执行该命令:
该命令成功返回一个游标。我们从游标中获取一条记录:
A2组的记录,并按客户汇总订单金额。后续计算相同。
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 方式处理非关系型数据源。这种方式也适用于处理其他数据源。只需设置外部库并使用相应的原生 SPL 语法即可访问。
例如访问 Kafka:
要访问 Elasticsearch:
要访问 HDFS:
SPL 的“原生驱动+简单封装”方式简洁便捷,既能保留数据源的特性,又能充分利用其存储和计算能力,可以直接访问,无需进行“某种”数据加载操作,也方便用户添加更多数据源。但由于 SPL 直接将数据访问代码写入脚本,并使用原生驱动,因此当数据源发生变化时,需要修改脚本。这意味着 SPL 对底层数据源的透明性不如逻辑数据仓库对数据源的透明性。
逻辑数据仓库使用专门的连接器连接到相应的数据源,对底层完全透明。对于每种类型的数据源,都需要专门开发连接器。开发过程非常复杂,可用的连接器也有限。用户也很难基于开源代码进行进一步的开发,通常只能等待供应商提供。
逻辑仓库使用的特殊连接器和 SPL 原生驱动加简单封装的方法各有优势。前者提供了深入的支持和优化,在一定程度上实现了透明性。后者更灵活,支持更多类型的数据源,并且易于添加。您应该根据需求选择合适的方案。
现在我们已经学习了如何使用 SPL 查询 RDB、CSV/XLS 文件、Restful/JSON 数据以及 MongoDB。接下来,您可以连接它们并执行混合源计算。
关注【索引目录】服务号,更多精彩内容等你来探索!

