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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:16