通过Synapse将CosmosDB的JSON数据导入SQL无服务器池遇阻求助
问题描述
场景
尝试将CosmosDB NoSQL分析存储中的无深度嵌套简单JSON数据,提供给同事在Synapse SQL Serverless Pool中使用,遇到两个核心问题:
问题1:视图创建时的类型不兼容报错
在Azure Data Studio基于CosmosDB链接服务创建视图,部分表抛出错误:
Column 'xxx' of type 'FLOAT' is not compatible with external data type 'Parquet physical type: INT64', please try with 'BIGINT'.
异常细节:涉事列仅包含整数,且视图中已明确指定数据类型为bigint。
问题2:Copy管道处理数组属性报错
使用Synapse Copy管道以CosmosDB为源写入Parquet接收器,针对数组属性开启“add array”选项后,运行时报错:
{ "errorCode": "2200", "message": "ErrorCode=JsonUnsupportedHierarchicalComplexValue,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=The retrieved type of data JArray is not supported yet. Please either remove the targeted column 'xxx' or enable skip incompatible row to skip the issue rows.,Source=Microsoft.DataTransfer.Common,'", "failureType": "UserError", "target": "xxxx", "details": [] }
解决建议
针对问题1:类型不兼容报错
- 显式强制转换类型:创建视图时,对涉事列使用
TRY_CAST或CAST直接转换为bigint,避免依赖自动推断。示例SQL:CREATE VIEW TargetView AS SELECT TRY_CAST(xxx AS BIGINT) AS xxx, -- 其他列 FROM OPENROWSET(PROVIDER = 'CosmosDB', ...) - 显式定义查询架构:在
OPENROWSET中通过WITH子句硬编码列类型,强制Synapse使用指定类型而非Parquet元数据的推断结果。示例:SELECT * FROM OPENROWSET( PROVIDER = 'CosmosDB', CONNECTION = 'Account=your-account;Database=your-db', OBJECT = 'your-container', SERVER_CREDENTIAL = 'your-credential' ) WITH ( xxx BIGINT, -- 其他列的类型定义 ) AS result - 刷新CosmosDB分析存储元数据:如果Parquet元数据因历史数据误标记为FLOAT,可触发分析存储的重新生成(通过CosmosDB门户的分析存储设置),纠正类型标记。
针对问题2:数组属性处理报错
- 改用Data Flow处理复杂类型:Copy管道对JArray支持有限,Data Flow可直接处理数组:
- 创建Data Flow,添加CosmosDB分析存储作为源;
- 对数组列使用
Flatten转换拆分为多行,或用Derived Column将数组转为字符串(如string(xxx)); - 将处理后的数据写入Parquet接收器。
- 在CosmosDB源端转换数组:如果不需要保留数组结构,在Copy管道的CosmosDB源查询中,用CosmosDB内置函数将数组转为字符串。示例查询:
SELECT ARRAY_TO_STRING(xxx, ',') AS xxx, * FROM c - 临时跳过不兼容行:若可接受部分数据丢失,在Copy管道的“设置”页开启“跳过不兼容的行”,但仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者picklepick
相关产品推荐
相关产品推荐

