Ler ficheiros grandes montados no DBFS com APIs de Python

Este artigo explica como resolver um erro que ocorre quando se lê grandes ficheiros montados em DBFS usando APIs pitão locais.

Problema

Se montar uma pasta e ler um ficheiro superior a dbfs:// 2GB numa API python como pandas, verá o seguinte erro:

/databricks/python/local/lib/python2.7/site-packages/pandas/parser.so in pandas.parser.TextReader.__cinit__ (pandas/parser.c:3427)()
/databricks/python/local/lib/python2.7/site-packages/pandas/parser.so in pandas.parser.TextReader._setup_parser_source (pandas/parser.c:6883)()
IOError: Initializing from file failed

Causa

O erro ocorre porque um argumento no método Python para ler um ficheiro é um int assinado, o comprimento do ficheiro é um int, e se o objeto é um ficheiro maior que 2GB, o comprimento pode ser maior do que o int máximo assinado.

Solução

Mover o ficheiro para o sistema de dbfs:// ficheiros (file://) local. Em seguida, leia usando a API Python. Por exemplo:

  1. Copie o ficheiro dbfs:// file:// de:

    %fs cp dbfs:/mnt/large_file.csv file:/tmp/large_file.csv
    
  2. Leia o arquivo na API dos pandas:

    import pandas as pd
    pd.read_csv('file:/tmp/large_file.csv',).head()