Мы используем специальный экстрактор 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, разделитель: '~');