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 来保存字典。
我刚刚发现我的 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 来保存字典。