Trino+MongoDB

在使用 Trino 与 MongoDB 连接时,会遇到一些问题,记录如下:

Array Of Objects#

MongoDB 中的 array of objects 在 Trino 的 mongodb connector 中会将其识别为 row of rows (row 是 Trino 的一种特殊数据类型)。

手工修改字段的定义,将其修改为 array(row()) 的形式则可以解决这个问题。

例如在一个字段中的数据如下:

"_adapters": [
  {
    "AdapterId": "1001",
    "AdapterName": "n1"
  },
  {
    "AdapterId": "1002",
    "AdapterName": "n2"
  }
]

MongoDB Connector 在自动识别时可能会识别为 row(row(“AdapterId” varchar, “AdapterName” varchar),row(“AdapterId” varchar, “AdapterName” varchar)) 这种形式,在使用时无法使用 array 的相关函数。

此时可以手工修改该字段的定义为:array(row(“AdapterId” varchar, “AdapterName” varchar)),就可以正常使用数组函数操作该字段了,例如:

select _adapters[1] from device where any_match(_adapters, x -> x.AdapterId = '1001');

参考连接:

https://www.starburst.io/community/forum/t/discover-schema-form-mongodb-to-trino/245

Trino文档中关于 row 数据类型的说明:https://trino.io/docs/current/language/types.html?highlight=row#row

MongoDB Connector 关于如何修改表定义的说明:https://trino.io/docs/current/connector/mongodb.html#table-definition

Pushdown#

Trino 支持 pushdown 功能,既将一些查询传递到数据库,因为有时候数据库处理会更快一些。

在 Trino 439 版本中,MongoDB Connector 支持简单数据类型的过滤条件 pushdown ,而对于 Array、Map 或 Row 这种复杂数据类型的过滤无法进行 pushdown。

例如上面 Array of objects 的例子中,当使用数组函数过滤数据时,在3百万条数据的规模下,sql要执行12秒。

select _adapters[1] from device where any_match(_adapters, x -> x.AdapterId = '1001');
Query 20240306_080721_00089_hpsjt, FINISHED, 1 node
Splits: 18 total, 18 done (100.00%)
12.29 [3.05M rows, 0B] [248K rows/s, 0B/s]
comments powered by Disqus