Преобразование из большого CSV в паркет с использованием ошибки Python - PullRequest
0 голосов
/ 15 января 2019

У меня есть CSV-файл, который содержит примерно 200+ столбцов и 1 миллион + строк. Когда я конвертирую из CSV в Python, у меня была ошибка:

     csv_file = 'bigcut.csv'
     chunksize = 100_000
     parquet_file ='output.parquet'
     parser=argparse.ArgumentParser(description='Process Arguments')
     parser.add_argument("--fname",action="store",default="",help="specify <run/update>")
     args=parser.parse_args()
     argFname=args.__dict__["fname"]
     csv_file=argFname
     csv_stream = pd.read_csv(csv_file, encoding = 'utf-8',sep=',', >chunksize=chunksize, low_memory=False)
     for i, chunk in enumerate(csv_stream):
        print("Chunk", i)
        if i==0:
           parquet_schema = pa.Table.from_pandas(df=chunk).schema
           parquet_writer = pq.ParquetWriter(parquet_file, parquet_schema, compression='snappy')
        table = pa.Table.from_pandas(chunk, schema=parquet_schema)
        parquet_writer.write_table(table)
     parquet_writer.close()

Когда я запускаю, выдает следующую ошибку

    File "pyconv.py", line 25, in <module>
table = pa.Table.from_pandas(chunk, schema=parquet_schema)
    File "pyarrow/table.pxi", line 1217, in pyarrow.lib.Table.from_pandas
    File "/home/cloud-user/pydev/py36-venv/lib64/python3.6/site-packages/pyarrow/pandas_compat.py", line 387, in dataframe_to_arrays
convert_types))
    File "/opt/rh/rh-python36/root/usr/lib64/python3.6/concurrent/futures/_base.py", line 586, in result_iterator
yield fs.pop().result()
    File "/opt/rh/rh-python36/root/usr/lib64/python3.6/concurrent/futures/_base.py", line 432, in result
return self.__get_result()
    File "/opt/rh/rh-python36/root/usr/lib64/python3.6/concurrent/futures/_base.py", line 384, in __get_result
raise self._exception
    File "/opt/rh/rh-python36/root/usr/lib64/python3.6/concurrent/futures/thread.py", line 56, in run
result = self.fn(*self.args, **self.kwargs)
    File "/home/cloud-user/pydev/py36-venv/lib64/python3.6/site-packages/pyarrow/pandas_compat.py", line 376, in convert_column
raise e
    File "/home/cloud-user/pydev/py36-venv/lib64/python3.6/site-packages/pyarrow/pandas_compat.py", line 370, in convert_column
return pa.array(col, type=ty, from_pandas=True, safe=safe)
     File "pyarrow/array.pxi", line 169, in pyarrow.lib.array
     File "pyarrow/array.pxi", line 69, in pyarrow.lib._ndarray_to_array
     File "pyarrow/error.pxi", line 81, in pyarrow.lib.check_status
      pyarrow.lib.ArrowInvalid: ("'utf-32-le' codec can't decode bytes in position 0-3: code point not in range(0x110000)", 'Conversion failed for column agent_number__c with type float64')

Я - новый pandas / pyarrow / python, если у кого-то есть какие-либо рекомендации, что я должен делать после отладки, ценится.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

CSV имеет около 3 миллионов записей. Мне удалось поймать 1 потенциальную проблему.

На 1 столбце есть тип данных string / text. Почему-то большинство из них числовые, однако некоторые из них смешаны с текстом, например, многие из них - 1000 230 400 и т. Д., Но немногие из них вводятся как 5 000, 100 000, 29 000.

Так что код как-то не понравился, попробуйте установить как число / int все вокруг.

Можете ли вы посоветовать?

0 голосов
/ 15 января 2019

Кодек utf-32-le не может декодировать байты в позиции 0-3

Похоже, библиотека пытается декодировать ваши данные в utf-32-le, тогда как вы читаете данные CSV как utf-8.

Так что вам как-то придется сказать этому читателю (pyarrow.lib) читать как utf-8 (я не знаю Python / Parquet, поэтому не могу предоставить точный код для этого).

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