Чтение csv с многострочными текстовыми столбцами по dask - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно прочитать csv, содержащий полнотекстовые данные, которые могут быть многострочными. Я могу прочитать этот csv с помощью чистого pandas (протестировано на версии 0.25.3 и 1.0.3) без каких-либо проблем, но когда я пытаюсь прочитать этот csv с помощью dask, я получаю ParserError: Error tokenizing data. C error: EOF inside string starting at row 28 номер строки зависит от файла, который я попробуйте прочитать.

Я подготовил искусственный фрейм данных для воспроизведения этой ошибки. Могу ли я что-то настроить в параметрах dask, входном файле препроцессора или это проблема с реализацией dask?

multiplication_factor = 71 # 70 works fine, 71 fail
number_of_columns = 100

import pandas as pd
import dask.dataframe as dd
import textwrap

pandas_default_kwargs = {    
    'cache_dates': True,
#     'chunksize': None, # not support by dask
    'comment': None,
#     'compression': 'infer', # not support by dask
    'converters': None,
    'date_parser': None,
    'dayfirst': False,
    'decimal': b'.',
    'delim_whitespace': False,
    'delimiter': None,
    'dialect': None,
    'doublequote': True,
    'dtype': object,
    'encoding': None,
    'engine': None,
    'error_bad_lines': True,
    'escapechar': None,
    'false_values': None,
    'float_precision': None,
    'header': 'infer',
#     'index_col': None, # not support by dask
    'infer_datetime_format': False,
#     'iterator': False, # not support by dask
    'keep_date_col': False,
    'keep_default_na': True,
    'lineterminator': None,
    'low_memory': True,
    'mangle_dupe_cols': True,
    'memory_map': False,
    'na_filter': True,
    'na_values': None,
    'names': None,
    'nrows': None,
    'parse_dates': False,
    'prefix': None,
    'quotechar': '"',
    'quoting': 0,
    'sep': ',',
    'skip_blank_lines': True,
    'skipfooter': 0,
    'skipinitialspace': False,
    'skiprows': None,
    'squeeze': False,
    'thousands': None,
    'true_values': None,
    'usecols': None,
    'verbose': False,
    'warn_bad_lines': True,
}

artificial_df_1_row = pd.DataFrame(
    data=[
        (
            textwrap.dedent(
                f"""
                some_data_for
                
                column_number_{i}
                """
            )
            for i 
            in range(number_of_columns)
        )
    ],
    columns=[f'column_name_number_{i}' for i in range(number_of_columns)]
)

path_to_single_line_csv = './single_line.csv'
path_to_multi_line_csv = './multi_line.csv'

# prepare data to save
single_line_df = artificial_df_1_row
multi_line_df = pd.concat(
    [single_line_df] * multiplication_factor,
)

# save data
single_line_df.to_csv(path_to_single_line_csv, index=False)
multi_line_df.to_csv(path_to_multi_line_csv, index=False)

# read 1 row csv by dask - works
dask_single_line_df = dd.read_csv(
    path_to_single_line_csv, 
    blocksize=None, # read as single block
    **pandas_default_kwargs
)
dask_single_line_df_count = dask_single_line_df.shape[0].compute()
print('[DASK] single line count', dask_single_line_df_count)

# read multiline csv by pandas - works
pandas_multi_line_df = pd.read_csv(
    path_to_multi_line_csv,
    **pandas_default_kwargs
)
pandas_multi_line_df_shape_0 = pandas_multi_line_df.shape[0]
print('[PANDAS] multi line count', pandas_multi_line_df_shape_0)

# read multine csv by dask - depends on number of rows fails or not
dask_multi_line_df = dd.read_csv(
    path_to_multi_line_csv, 
    blocksize=None,  # read as single block
    **pandas_default_kwargs
)
dask_multi_line_df_shape_0 = dask_multi_line_df.shape[0].compute()
print('[DASK] multi line count', dask_multi_line_df_shape_0)

1 Ответ

0 голосов
/ 14 июля 2020

Способ только , которым вы можете читать такой файл, - это убедиться, что границы фрагментов не находятся в пределах строки в кавычках, что, если вы не знаете много о структуре данных, означает, что файл вообще не разбивается (но вы все равно можете распараллеливать файлы).

Это потому, что единственный способ узнать, находитесь ли вы в строке, заключенной в кавычки, - это проанализировать файл с самого начала, а способ достижения параллелизма в dask - чтобы каждая задача чтения фрагментов была полностью независимой, требовалось только смещение файла. На практике dask читает со смещения и считает первый маркер новой строки точкой, с которой начинается синтаксический анализ.

...