Presto:如何按查询为JSON列转换不同Schema?
解决方案:在Presto中动态转换MongoDB的data字段结构
当然可以解决这个问题!由于你的MongoDB集合里data字段的结构会跟着type字段变化,Presto自动推断的固定schema肯定没法适配所有场景。我们可以用条件判断+类型转换的方式,在查询时针对不同type的数据,把data转换成你需要的指定格式,避免非匹配类型返回NULL。
核心思路
利用CASE WHEN根据type字段的值做分支处理,再通过CAST()把data强制转换成对应类型的Row结构——只要目标Row的字段名、数据类型和对应type下的JSON结构匹配,就能正确解析出数据,而不是返回NULL。
示例SQL
假设你的表名为mongodb_collection,下面的查询会针对type = 'event_type'的数据,把data转换成你需要的格式,同时保留原有类型的data结构:
SELECT id, type, CASE -- 针对需要转换格式的type,指定目标Row结构 WHEN type = 'event_type' THEN CAST(data AS ROW( user bigint, event bigint, mode varchar, channel varchar, time timestamp, metadata array(varchar) )) -- 保留原schema适配的type的data结构 WHEN type = 'original_type' THEN CAST(data AS ROW( user bigint, type varchar, mode varchar, status boolean )) -- 其他类型可以返回NULL,或者自定义默认结构 ELSE NULL END AS formatted_data, timestamp FROM mongodb_collection;
关键注意事项
- 结构匹配要求:必须保证目标Row的字段名、数据类型和对应
type下的dataJSON结构完全一致。比如如果data里的event是字符串类型,你写成bigint的话,转换会失败返回NULL。 - 可选字段处理:如果JSON里某些字段是可选的,可以在Row定义里加上
NULLABLE标记,比如user bigint NULL,这样即使该字段不存在,也不会导致整个转换失败。 - 全局转换尝试:如果不需要区分
type,只想尝试把所有data转换成目标格式,可以直接用CAST(data AS ROW(...)),但这样非匹配类型的data还是会返回NULL,所以结合CASE WHEN是更稳妥的方案。
内容的提问来源于stack exchange,提问作者geopet85
相关产品推荐
相关产品推荐

