Поведение читателя CSV
Мне нравится эта функция: СОЗДАТЬ ПРОСМОТР ontime КАК ВЫБРАТЬ * FROM read_csv_auto('test.csv'); но заметил, что он неправильно определяет тип столбцов, загружающих большие файлы CSV, и не может читать строки, которые не вписываются в указанный тип столбца. Какое количество строк по умолчанию используется программой чтения csv для определения типов столбцов? Можно ли изменить количество этих строк?
1 ответ
Какое количество строк по умолчанию используется программой чтения csv для определения типов столбцов?
Текущее поведение таково, что выбираются 10 фрагментов по 100 строк в каждом. Далее его можно разбить на два сценария.
- Файл имеет ~ 1000 строк или меньше (или сжат): фрагменты выбираются без промежутков между ними (т.е. учитываются первые макс. 1000 строк)
- Файл имеет >> 1000 строк: выбираются первые 100 строк, еще 9 равноудаленных фрагментов по 100 строк выбираются по всему файлу.
В обоих случаях первые 100 строк создадут начальное предположение о типе, которое будет проверяться на согласованность с последующими фрагментами. Если типы не совпадают, предположение изменяется соответствующим образом.
Существует теоретическая (и практическая) вероятность того, что предположение о типе все же окажется неверным. Скажем, файл с 1 000 000 строк имеет столбец, который содержит 1000 строковых значений и 999 000 целочисленных значений. Предполагая, что строковые значения распределены случайным образом, существует вероятность ~36,7%, что фрагменты выборки не будут содержать НИКАКОГО строкового значения ((1-(1000/1000000))^1000=0,367..). В этом случае угадыватель типов предложит ввести целочисленный тип для этого столбца, а синтаксический анализатор захлебнется первым строковым значением. Было бы разумно пересмотреть предположение на этом этапе (например, реализация h2oai/datatable делает это в datatable / reader_fread.cc). Но это поведение на данный момент (v.0.2) не реализовано в duckdb.
Рекомендуемый обходной путь - использовать функцию duckdb read_csv и вручную определить схему / тип данных. См. Раздел " Заявление о копировании" здесь: DuckDB Docs - CSV Loading.
Можно ли изменить количество этих строк?
Количество строк в блоке определяется в исходном коде, см. Duckdb / buffered_csv_reader.hpp, строка 15. Если вы хотите изменить это число, вам придется собрать duckdb из исходного кода (что на самом деле довольно просто). Однако размер блока не может быть больше стандартного размера вектора, который по умолчанию равен 1024. Тем не менее, я думаю, что было бы возможно предоставить пользователю размер и количество фрагментов выборки в качестве опции, и мы могли бы подумать о том, чтобы сделать что-то подобное в будущем выпуске. Другой вариант - автоматически установить количество фрагментов выборки относительно общего количества строк в файле. Спасибо за вопрос.