在Superset中用Apache Drill提取MongoDB数据时遇类型错误求助
解决Apache Drill读取MongoDB时INT/BIGINT类型冲突问题
问题原因
MongoDB是无Schema数据库,你的noOfstudet字段部分文档存储为INT类型,部分为BIGINT类型。Drill默认会根据前N条采样数据推断字段类型,当后续遇到类型不匹配的文档时,就会抛出类型冲突错误。直接使用CAST无效是因为Drill在数据解析阶段就已经检测到类型不兼容,CAST函数根本无法执行。
解决方案
1. 强制Drill统一字段类型(推荐)
修改Drill的MongoDB存储插件配置,强制指定noOfstudet字段为BIGINT类型,让Drill在读取时自动转换所有值:
- 登录Drill Web控制台(默认端口8047)
- 进入
Storage页面,找到mongodb插件,点击Update - 在配置中添加
type_mappings节点,指定字段类型:
{ "type_mappings": { "fields": { "collegename.noOfstudet": "BIGINT" } }, // 保留原有其他配置 }
- 保存配置并重启Drill服务,之后查询即可正常读取所有数据。
2. 查询时兼容类型转换
如果无法修改Drill配置,可以在查询时先将字段转为字符串,再转换为BIGINT,同时用TRY_CAST避免转换失败导致查询中断:
若需要展开数组读取所有noOfstudet值:
SELECT nameofcity, TRY_CAST(CAST(c.noOfstudet AS VARCHAR) AS BIGINT) AS noOfstudet FROM your_collection, UNNEST(collegename) AS t(c)
若仅需数组第一个元素的noOfstudet:
SELECT nameofcity, TRY_CAST(CAST(collegename[0].noOfstudet AS VARCHAR) AS BIGINT) AS noOfstudet FROM your_collection
TRY_CAST会在转换失败时返回NULL,而非直接抛出错误,保证查询能完整执行。
3. 调整Drill的采样行数
Drill默认采样前100条文档推断类型,你可以修改drill-override.conf中的drill.exec.store.mongodb.sampling.size参数,增大采样行数,让Drill检测到字段的多类型情况,自动将字段类型推断为兼容的BIGINT:
drill.exec.store.mongodb.sampling.size: 500
修改后重启Drill即可,不过这种方法依赖数据分布,可靠性不如前两种方案。
内容的提问来源于stack exchange,提问作者Maneesh M M
相关产品推荐
相关产品推荐

