Azure Synapse查询ADF日志出现JSON_VALUE报错及JSON截断问题求助
你遇到的13609 JSON格式报错和jsonContent截断问题,核心是当前OPENROWSET的分隔符配置错误,没有正确匹配ADF运行日志每行一条JSON的存储格式,解决方案如下:
1. 修正OPENROWSET核心配置
替换你的查询语句中OPENROWSET部分的参数,修改后的完整查询示例如下:
SELECT TOP 100 cast(r.filepath(3) as varchar(100)) as [FACTORIE_NAME] ,cast(r.filepath(4) as varchar(4)) as [year] ,cast(r.filepath(5) as varchar(2)) as [month] ,cast(r.filepath(6) as varchar(2)) as [day] ,cast(r.filepath(7) as varchar(2)) as [hour] ,cast(r.filepath(8) as varchar(2)) as [minute] ,JSON_VALUE(jsonContent, '$.runId') as [pipelineRunId] ,JSON_VALUE(jsonContent, '$.pipelineName') as [pipelineName] FROM OPENROWSET( BULK 'https://blobDemo.blob.core.windows.net/insights-logs-activityruns/resourceId=/SUBSCRIPTIONS/*/RESOURCEGROUPS/*/PROVIDERS/MICROSOFT.DATAFACTORY/FACTORIES/*/y=*/m=*/d=*/h=*/m=*/*.json', FORMAT = 'CSV', FIELDTERMINATOR = '0x00', ROWTERMINATOR = '0x0a', CODEPAGE = '65001', PARSER_VERSION = '2.0' ) WITH ( jsonContent varchar(MAX) ) AS [r] WHERE r.filepath(4) = '2021' and r.filepath(5) = '07' and r.filepath(6) = '22'
核心修改点说明:
- 将
FIELDTERMINATOR改为0x00(空字符),该字符不会出现在标准JSON内容中,确保单条日志的所有内容都会被读取到jsonContent单个字段中,不会被误拆分 - 将
ROWTERMINATOR改为0x0a(标准换行符),匹配ADF运行日志每行存储一条JSON记录的格式,正确拆分不同运行日志 - 新增
CODEPAGE = '65001'指定UTF-8编码,兼容ADF日志的默认导出编码 - 新增
PARSER_VERSION = '2.0'启用Synapse无服务池最新的CSV解析器,对varchar(max)类型的字段支持更稳定,避免超长JSON被截断 - WHERE条件中的filepath值改为字符串格式匹配,避免隐式类型转换导致的分区过滤失效
2. 可选容错配置
如果仍有偶发的JSON格式报错,可以在OPENROWSET的参数中新增MAXERRORS = 1000,允许跳过最多1000行损坏的日志记录,避免少量坏数据导致整个查询失败。如果需要定位损坏的日志,可以先查询匹配文件的路径,逐个文件测试读取,定位到损坏文件后单独处理即可。
3. 验证方法
修改配置后先执行SELECT TOP 10 jsonContent FROM [上述OPENROWSET查询逻辑],检查返回的jsonContent是否为完整的JSON字符串,确认无截断后再执行JSON_VALUE等解析逻辑即可。
内容的提问来源于stack exchange,提问作者SniperPro
相关产品推荐
相关产品推荐

