You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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在读取时自动转换所有值:

  1. 登录Drill Web控制台(默认端口8047)
  2. 进入Storage页面,找到mongodb插件,点击Update
  3. 在配置中添加type_mappings节点,指定字段类型:
{
  "type_mappings": {
    "fields": {
      "collegename.noOfstudet": "BIGINT"
    }
  },
  // 保留原有其他配置
}
  1. 保存配置并重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:47:29