使用SQL生成Unity Catalog JSON时遇MAP函数报错的原因
解决Unity Catalog生成嵌套JSON时的[INVALID_OPTIONS.NON_MAP_FUNCTION]错误
错误原因分析
你遇到的[INVALID_OPTIONS.NON_MAP_FUNCTION]错误,核心问题是嵌套使用TO_JSON时,把MAP类型转成了字符串,而非保持嵌套的MAP结构。尽管你用了MAP函数,但内层的TO_JSON会将列-类型的MAP转为JSON字符串,导致外层MAP的值是字符串类型,而非系统期望的嵌套MAP类型,触发了非MAP函数的校验错误。
正确实现方案
要生成table_name下嵌套列及其类型的JSON结构,需要分两步聚合生成嵌套MAP,再统一转为JSON:
步骤1:按表聚合列与类型的MAP
先从Unity Catalog的元数据表中,按表名分组,用MAP_AGG函数将每个表的列名和对应数据类型聚合成一个MAP:
SELECT table_name, MAP_AGG(column_name, data_type) AS column_type_map FROM <your_catalog>.<your_schema>.information_schema.columns GROUP BY table_name
步骤2:聚合所有表的MAP为全局映射并转JSON
基于第一步的结果,再用MAP_AGG将表名和对应的列类型MAP聚合成一个大MAP,最后用TO_JSON转为目标JSON结构:
SELECT TO_JSON(MAP_AGG(table_name, column_type_map)) AS unity_catalog_json FROM ( SELECT table_name, MAP_AGG(column_name, data_type) AS column_type_map FROM <your_catalog>.<your_schema>.information_schema.columns GROUP BY table_name )
最终JSON结构示例
执行后会生成符合你需求的嵌套JSON:
{ "table_1": { "id": "int", "name": "string" }, "table_2": { "product_id": "bigint", "price": "double" } }
常见误区修正
如果你之前的写法类似下面这样,就会触发错误:
-- 错误示例:内层TO_JSON将MAP转为字符串,导致外层MAP值非MAP类型 SELECT TO_JSON(MAP(table_name, TO_JSON(MAP(column_name, data_type)))) FROM information_schema.columns GROUP BY table_name
这种写法中,TO_JSON(MAP(column_name, data_type))返回的是字符串,外层MAP的value是字符串而非嵌套MAP,不符合系统对TO_JSON处理嵌套MAP的要求,因此报错。
内容的提问来源于stack exchange,提问作者OdiumPura
相关产品推荐
相关产品推荐

