Поведение читателя CSV - PullRequest
       7

Поведение читателя CSV

0 голосов
/ 03 августа 2020

Мне нравится эта функция: СОЗДАТЬ ПРОСМОТР ontime КАК ВЫБРАТЬ * FROM read_csv_auto ('test.csv'); но заметил, что он неправильно определяет тип столбцов, загружающих большие файлы CSV, и не может читать строки, которые не вписываются в указанный тип столбца. Какое количество строк по умолчанию используется программой чтения csv для определения типов столбцов? Можно ли изменить количество этих строк?

1 Ответ

1 голос
/ 05 августа 2020

Какое количество строк по умолчанию используется программой чтения csv для определения типов столбцов?

Текущее поведение таково, что отбираются 10 фрагментов по 100 строк в каждом. В дальнейшем его можно разбить на два сценария: ios.

  1. Файл имеет ~ 1000 строк или меньше (или сжат): фрагменты выбираются без промежутков между ними (т.е. первые макс. 1000 учитываются строки)
  2. Файл имеет >> 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 .

Можно ли изменить количество этих строк?

Количество строк в блоке определяется в источнике, см. duckdb / buffered_csv_reader.hpp , строка 15. Если вы хотите изменить число, вам придется собрать duckdb из исходного кода. (что на самом деле довольно просто). Однако размер блока не может быть больше стандартного размера вектора, который по умолчанию равен 1024. Тем не менее, я думаю, что было бы возможно предоставить пользователю размер и количество фрагментов выборки в качестве опции, и мы могли бы подумать о том, чтобы сделать что-то подобное в будущем выпуске. Другой вариант - автоматически установить количество фрагментов выборки относительно общего количества строк в файле. Спасибо за вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...