Apache Drill+MongoDB创建数据集缺失空值/空数组列的解决咨询
解决Apache Superset通过Drill连接MongoDB时列缺失的问题
问题概述
通过Apache Drill搭建Superset与MongoDB的连接后,Drill Web UI可正常查询所有数据,但在Superset创建带Schema的MongoDB数据集时,系统仅读取集合中首个非空、非数组文档的列,其余字段被忽略。已知Drill提供store.json.all_text_mode和store.mongo.all_text_mode会话选项,可强制将所有数据按varchar类型读取,但不清楚如何为Superset会话配置该选项,以下是可行的解决办法:
方法1:全局启用Drill的all_text_mode配置
无需在Superset中单独设置,直接修改Drill的MongoDB存储插件配置,让所有连接会话(包括Superset)默认生效:
- 登录Drill Web UI,进入Storage页面
- 找到名为
mongo的存储插件,点击Update进入配置编辑界面 - 在配置的
config节点下添加以下参数:"store.mongo.all_text_mode": true, "store.json.all_text_mode": true - 保存配置并重启Drill服务,此时Drill会将MongoDB所有字段按字符串类型读取,Superset可识别全部列
方法2:在Superset SQL Lab中临时设置会话参数
若不想全局修改配置,可在Superset中通过自定义SQL先初始化Drill会话参数,再创建数据集:
- 打开Superset的SQL Lab,选择对应的Drill数据源
- 先执行以下Drill SQL命令设置会话选项:
ALTER SESSION SET `store.mongo.all_text_mode` = true; ALTER SESSION SET `store.json.all_text_mode` = true; - 接着执行目标集合的查询语句(如
SELECT * FROM mongo.my_collection),基于该查询结果创建数据集(需选择自定义SQL模式,而非直接选择表)
方法3:统一MongoDB集合的Schema结构
从数据源层面解决字段缺失问题:
- 确保集合内所有文档包含相同字段(即使值为
null或空数组),避免部分文档缺失字段的情况 - 对于数组类型字段,保证集合中首个文档包含该字段(哪怕是空数组),让Drill在Schema探测阶段能识别到该列
方法4:在Drill中创建统一Schema的视图
通过Drill视图显式定义所有需要的字段,再让Superset连接该视图:
- 登录Drill Web UI,执行
CREATE VIEW语句,显式指定所有需读取的字段,并用COALESCE处理空值:CREATE VIEW mongo.unified_view AS SELECT COALESCE(user_id, '') AS user_id, COALESCE(order_amount, 0) AS order_amount, tags, -- 列出所有需要的字段 create_time FROM mongo.orders; - 在Superset中选择该视图作为数据源,即可获取所有预定义的列
内容的提问来源于stack exchange,提问作者Edem
相关产品推荐
相关产品推荐

