Пользовательский экстрактор USQL - Как обработать json-объект размером более 4 МБ

Мы используем специальный экстрактор USQL для сглаживания структуры json. Приведенный ниже пример кода отлично работает, если строка (объект json) json меньше 4 МБ. Если размер строки превышает 4 МБ, мы получаем ошибку «Запись во входном файле длиннее 4194304 байта». Аналогичный код пробуется в автономном приложении C # для строк размером более 4 МБ , он отлично работает. Есть ли у нас какие-либо ограничения на размер json с помощью пользовательского экстрактора usql? Как мы обрабатываем сообщения json размером более 4 МБ?

Ошибка возникает из выделенной строки в приведенном ниже коде
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; < br> закрытая строка DELIMITER = "~";
общедоступный CustomJSONExtractor (Encoding encoding = null, string row_delim = "\ r \ n")
{
_encoding = Encoding.UTF8;
_row_delim = _encoding .GetBytes (row_delim);
}
// Каждая строка json в необработанном файле преобразуется в плоскую структуру
публичное переопределение IEnumerable Extract (ввод IUnstructuredReader, вывод IUpdatableRow)
{
/ / Прочитать строку за строкой
foreach (поток, текущий в input.Split (_row_delim))
{
using (StreamReader lineReader = new StreamReader (current, this._encoding))
{
// читает всю строку
string line = lineReader.ReadToEnd ();
// разбивает строку на несколько переменных
output.Set (1, "A ~ 1" );
yield return output.AsReadOnly ();
}
}

}
}
}


образец кода USQL

DECLARE @ INPUT_FILE = "sample-data.txt"; @jsonDatafile = EXTRACT key string, jsonObjStr string FROM @INPUT_FILE ИСПОЛЬЗУЯ новый Damen.DataLakeAnalytics.CustomJSONExtractor (null, row_delim: "\ n"); @dataJsonObject = ВЫБРАТЬ jsonObjStr как rawData FROM @dataAsStrings; ВЫХОД @dataJsonObject TO @flattenedOutputFile ИСПОЛЬЗУЯ Outputters.Text (outputHeader: false, цитирование: false, разделитель: '~');


person Akhilesh Balakrishnan    schedule 30.09.2019    source источник
comment
Мне удалось обработать гораздо больший файл на (локальной машине) ADLS. Пожалуйста, будьте более конкретными или отправьте фрагмент, который, по вашему мнению, работает над автономным приложением C #.   -  person Milan    schedule 01.10.2019
comment
Код @ Milan-ниже работает, как я уже упоминал, lineReader.ReadToEnd () не работал в ADLA, но он работает в программе ниже, вы пробовали в лазурном облаке? открытый класс Утилита {общедоступная статическая строка ProcessData () {с использованием (StreamReader lineReader = new StreamReader ({pathToaFile} test-data-1.txt)) {строка line = lineReader.ReadToEnd (); int a = line.Length; Console.WriteLine (длина символа: + a); }}}   -  person Akhilesh Balakrishnan    schedule 02.10.2019


Ответы (1)


Максимальный размер действительно составляет 4 МБ для строк и 128 КБ для строки. Что вы можете сделать, так это использовать решение, представленное в этом аналогичном ответе:

Каков максимально допустимый размер строки в U -SQL?

person Kiril1512    schedule 02.10.2019