Apache Drill连接Mongo与Saiku时列名显示为*的技术问题咨询
解决Saiku Schema Designer连接Drill时列名显示为*的问题
我之前遇到过完全一样的情况,这种问题本质上是Drill对MongoDB集合的元数据解析没有被Saiku正确识别到,或者是Drill的配置没有让元数据充分暴露给JDBC客户端。下面是几个可以逐步排查的解决方案:
1. 检查Drill的MongoDB存储插件配置
首先确认你的MongoDB存储插件是否开启了自动schema发现功能,这是Drill能识别集合字段的关键。
- 打开Drill的Web控制台(默认地址:
http://hostname:8047),进入Storage页面,找到MongoDB的存储插件 - 查看配置中的
enableSchemaDiscovery参数,确保它被设置为true,示例配置如下:{ "type": "mongo", "connection": "mongodb://hostname:27017/", "enableSchemaDiscovery": true, "batchSize": 1000, "readPreference": "primaryPreferred" } - 如果之前是
false,修改后记得重启Drillbit服务,让配置生效。
2. 强制刷新Drill的元数据缓存
Drill会缓存数据源的元数据,有时候即使修改了配置,旧缓存还会影响显示。你可以通过Drill的SQL界面手动刷新:
- 刷新单个集合的元数据:
REFRESH TABLE mongo.`你的数据库名`.`你的集合名`; - 刷新整个数据库的元数据:
REFRESH DATABASE mongo.`你的数据库名`;
执行完刷新后,回到Saiku重新加载schema,看看列名是否正常显示。
3. 优化Saiku的JDBC连接配置
- 确保JDBC URL指定了正确的Drill schema,比如你的MongoDB数据挂载在
mongoschema下,URL可以改成:jdbc:drill:drillbit=hostname:31010;schema=mongo - 在Saiku创建Schema时,确认选择的是
mongo数据源,而不是默认的dfs或其他schema,避免加载错误的元数据。
4. 验证Drill JDBC驱动版本兼容性
驱动版本不匹配是常见的隐性问题,一定要保证你在Saiku中使用的Drill JDBC驱动jar包,和你的Drill服务器版本完全一致(比如都是1.20.0或1.21.1)。版本不一致可能会导致元数据的传递格式不兼容,进而让Saiku无法解析列名。
5. 检查MongoDB集合的结构一致性
如果你的MongoDB集合中文档结构不统一(比如部分文档缺少某些字段,或者字段类型不一致),Drill可能无法生成明确的schema,就会用*来表示所有字段。
- 先在Drill的SQL界面执行查询,验证Drill本身是否能识别字段:
SELECT * FROM mongo.`你的数据库名`.`你的集合名` LIMIT 10; - 如果Drill查询能返回具体字段,那问题在Saiku的解析逻辑;如果Drill也显示
*,可以尝试用ALTER TABLE命令手动指定集合的schema,或者调整Drill的store.json.read_numbers_as_double等参数来统一字段类型。
内容的提问来源于stack exchange,提问作者sanjay gaur
相关产品推荐
相关产品推荐

