我刚刚发现,我的mongodb上有一个集合,我无法与prestodb查询(server and 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$000(MongoSession.java:76)
at com.facebook.presto.mongodb.MongoSession$1.load(MongoSession.java:128)
at com.facebook.presto.mongodb.MongoSession$1.load(MongoSession.java:123)
(...) very long stack trace
我已经搜索了与集合命名有关的一些问题,但是该问题遵循相同的惯例(实际上它没有下划线,有些则可以使用,而且有效)。
最可能的原因是什么?也许是不一致的模式?(我有线索,MongoDB中的某个字段有时有时,有时是整数,但这需要大量挖掘才能确认)
感谢@miniway,我已经发现Presto未能推断出一些嵌入式文档的完整模式。
通过运行
db.getCollection("_schema").findOne({"table" : "tableName"})
我注意到了一些映射,例如row()
,这意味着Presto未能映射它。特定字段很难映射,因为它是通过pymongo
插入的通用Python字典,这意味着没有固定的模式。
"解决方案"是简单地使用VARCHAR保存字典的手动定义该模式的部分。