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]