prestodb 引发 IllegalArgumentException:一个 mongodb 集合的基数为空

prestodb raises IllegalArgumentException: base is empty for one mongodb collection

我刚刚发现我的 MongoDB 上有一个集合我无法使用 prestodb(服务器和 CLI 版本 0.157)进行查询。

其他所有的集合都可以正常查询,但是这个集合不能直接查询,也不能与其他集合查询。它不是最大的也不是最复杂的集合,但显然 presto 在类型方面遇到了麻烦。

java.lang.IllegalArgumentException: base is empty
    at com.facebook.presto.spi.type.TypeSignature.checkArgument(TypeSignature.java:370)
    at com.facebook.presto.spi.type.TypeSignature.<init>(TypeSignature.java:48)
    at com.facebook.presto.spi.type.TypeSignature.parseTypeSignature(TypeSignature.java:101)
    at com.facebook.presto.spi.type.TypeSignature.parseRowTypeSignature(TypeSignature.java:199)
    at com.facebook.presto.spi.type.TypeSignature.parseTypeSignature(TypeSignature.java:104)
    at com.facebook.presto.spi.type.TypeSignature.parseTypeSignature(TypeSignature.java:94)
    at com.facebook.presto.mongodb.MongoSession.buildColumnHandle(MongoSession.java:199)
    at com.facebook.presto.mongodb.MongoSession.loadTableSchema(MongoSession.java:185)
    at com.facebook.presto.mongodb.MongoSession.access[=11=]0(MongoSession.java:76)
    at com.facebook.presto.mongodb.MongoSession.load(MongoSession.java:128)
    at com.facebook.presto.mongodb.MongoSession.load(MongoSession.java:123)
    (...) very long stack trace

我搜索了一些与集合命名相关的问题,但这个遵循相同的约定(它实际上没有下划线,其他一些有下划线并且有效)。

最可能的原因是什么?也许是一个不一致的模式? (我知道 MongoDB 中的某个字段有日期,有时还有整数,但这需要大量挖掘才能确认)

感谢@miniway,我发现 Presto 未能推断出一些嵌入式文档的完整架构。

来自 运行

db.getCollection("_schema").findOne({"table" : "tableName"})

我注意到一些像 row() 这样的映射,这意味着 Presto 无法映射它。特定字段很难映射,因为它是通过 pymongo 插入的通用 python 字典,这意味着没有固定模式。

"solution" 是简单地手动定义架构的那一部分,使用 varchar 来保存字典。