我们使用自定义的USQL提取器将json结构展平。如果json的line(json对象)小于4 MB,则以下示例代码可以正常工作。如果行大小大于4 MB,则会出现错误“输入文件中的记录长于4194304字节。” 对于高于4 MB的行,在C#独立应用程序中尝试了类似的代码,效果很好。使用usql自定义提取器对json大小是否有任何限制?我们如何处理大小超过4 MB的json消息?
错误从下面的代码
中突出显示的行引发
string 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
{
私有只读编码_encoding;
私有只读字节[] _row_delim;
私有字符串DELIMITER =“〜”;
公共CustomJSONExtractor(编码编码= null,字符串row_delim =“ \ r \ n”)
{
_encoding = Encoding.UTF8;
_row_delim = _encoding.GetBytes(row_delim);
}
//原始文件中的每个json行都转换为平面结构
公共重写IEnumerable Extract(IUnstructuredReader输入,IUpdatableRow输出)
{
//逐行读取输入
foreach(输入流中的流电流。Split(_row_delim))
{
使用(StreamReader lineReader = new StreamReader(current,this._encoding))
{
//读取整行
字符串line = lineReader.ReadToEnd();
//将行换成多个变量
output.Set(1,“ A〜1”);
收益回报output.AsReadOnly();
}
}
}
}
}
DECLARE @ INPUT_FILE =“ sample-data.txt”; @jsonDatafile =提取键字符串,JSONObjStr字符串来自@INPUT_FILE,使用新的Damen.DataLakeAnalytics.CustomJSONExtractor(null,row_delim:“ \ n”); @dataJsonObject =从@dataAsStrings中选择jsonObjStr AS rawData; 使用Outputters.Text(outputHeader:false,quote:false,delimiter:'〜');将@dataJsonObject转换为@flattenedOutputFile
答案 0 :(得分:0)
实际上,行的最大大小为4MB,字符串的最大大小为128KB。您可以使用此类似答案中提供的解决方案: