首页 > 解决方案 > 自定义 USQL 提取器 - 如何处理超过 4 MB 的 json 对象

问题描述

我们使用自定义 USQL 提取器来展平 json 结构。如果 json 的 line(json object) 小于 4 MB,则以下示例代码可以正常工作。如果行大小超过 4 MB,那么我们会收到错误“输入文件中的记录长于 4194304 字节”。在 C# 独立应用程序中针对高于 4 MB 的行尝试了类似的代码,它工作正常。使用 usql 自定义提取器对 json 大小有任何限制吗?我们如何处理大小超过 4 MB 的 json 消息?

错误是从下面代码
字符串 line = lineReader.ReadToEnd();中突出显示的行引发的


自定义提取器示例代码

使用 Microsoft.Analytics.Interfaces;
使用 System.Collections.Generic;
使用 System.IO;
使用 System.Text;
使用 Microsoft.Analytics.Types.Sql;
使用 Newtonsoft.Json;

命名空间 Company.DataLakeAnalytics
{
[SqlUserDefinedExtractor(AtomicFileProcessing = false)]
公共类 CustomJSONExtractor : IExtractor
{
private readonly Encoding _encoding;
私有只读字节[] _row_delim;
私有字符串 DELIMITER = "~";
public CustomJSONExtractor(Encoding encoding = null, string row_delim = "\r\n")
{
_encoding = Encoding.UTF8;
_row_delim = _encoding.GetBytes(row_delim);
}
//原始文件中的每一个json行都被转换为一个平面结构
public override IEnumerable Extract(IUnstructuredReader input, IUpdatableRow output)
{
//逐行读取输入
foreach (Stream current in input.Split(_row_delim))
{
using (StreamReader lineReader = new StreamReader(current, this._encoding))
{
//读取整行
字符串 line = lineReader.ReadToEnd ();
//将行换成多个变量
output.Set(1, "A~1");
产生返回输出。AsReadOnly();
}
}

}
}
}


示例 USQL 代码

声明 @INPUT_FILE="sample-data.txt"; @jsonDatafile = EXTRACT key string, jsonObjStr string FROM @INPUT_FILE USING new Damen.DataLakeAnalytics.CustomJSONExtractor(null,row_delim:"\n") ; @dataJsonObject = 从 @dataAsStrings 中选择 jsonObjStr 作为 rawData;输出 @dataJsonObject 到 @flattenedOutputFile 使用 Outputters.Text(outputHeader:false,quoting:false,delimiter:'~');

标签: azure-data-lakeu-sql

解决方案


行的最大大小确实为 4MB,字符串的最大大小为 128KB。您可以做的是使用此类似答案中提供的解决方案:

U-SQL 中字符串的最大允许大小是多少?


推荐阅读