自定义USQL提取程序-如何处理4 MB以上的json对象

时间:2019-09-30 15:44:36

标签: azure-data-lake u-sql

我们使用自定义的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();
                }
            }

        }
    }
}


示例USQL代码

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

1 个答案:

答案 0 :(得分:0)

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

What is the maximum allowed size for String in U-SQL?