Lecture de fichiers montés sur un fichier DBFS volumineux à l’aide des API PythonReading large DBFS-mounted files using Python APIs

Cet article explique comment résoudre une erreur qui se produit lors de la lecture de fichiers montés sur un grand nombre d’interfaces DBFS à l’aide des API Python locales.This article explains how to resolve an error that occurs when you read large DBFS-mounted files using local Python APIs.

ProblèmeProblem

Si vous montez un dossier sur dbfs:// et que vous lisez un fichier de plus de 2 Go dans une API Python telle que pandas, vous verrez l’erreur suivante :If you mount a folder onto dbfs:// and read a file larger than 2GB in a Python API like pandas, you will see following error:

/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

CauseCause

L’erreur se produit parce qu’un argument dans la méthode Python pour lire un fichier est un entier signé, que la longueur du fichier est un entier et que si l’objet est un fichier d’une taille supérieure à 2 Go, la longueur peut être supérieure à la valeur maximale signée int.The error occurs because one argument in the Python method to read a file is a signed int, the length of the file is an int, and if the object is a file larger than 2GB, the length can be larger than maximum signed int.

SolutionSolution

Déplacez le fichier de dbfs:// vers le système de fichiers local (file://) .Move the file from dbfs:// to local file system (file://). Lisez ensuite à l’aide de l’API Python.Then read using the Python API. Par exemple :For example:

  1. Copiez le fichier de dbfs:// vers file:// :Copy the file from dbfs:// to file://:

    %fs cp dbfs:/mnt/large_file.csv file:/tmp/large_file.csv
    
  2. Lisez le fichier dans l’API pandas :Read the file in the pandas API:

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