web-dev-qa-db-fra.com

Écriture de partitions Dask dans un seul fichier

Nouveau sur dask, j'ai un 1GB Fichier CSV quand je le lis dans dask dataframe il crée environ 50 partitions après mes modifications dans le fichier quand j'écris, il crée autant de fichiers que de partitions.
Existe-t-il un moyen d'écrire toutes les partitions dans un seul fichier CSV et existe-t-il un moyen d'accéder aux partitions?
Je vous remercie.

21
rey

Réponse courte

Non, Dask.dataframe.to_csv écrit uniquement des fichiers CSV dans différents fichiers, un fichier par partition. Cependant, il existe des moyens de contourner cela.

Concaténer ensuite

Peut-être juste concaténer les fichiers après que dask.dataframe les ait écrits? Cela est susceptible d'être presque optimal en termes de performances.

df.to_csv('/path/to/myfiles.*.csv')
from glob import glob
filenames = glob('/path/to/myfiles.*.csv')
with open('outfile.csv', 'w') as out:
    for fn in filenames:
        with open(fn) as f:
            out.write(f.read())  # maybe add endline here as well?

Ou utilisez Dask.delayed

Cependant, vous pouvez le faire vous-même en utilisant dask.delayed , par en utilisant dask.delayed avec des dataframes

Cela vous donne une liste de valeurs différées que vous pouvez utiliser comme vous le souhaitez:

list_of_delayed_values = df.to_delayed()

C'est ensuite à vous de structurer un calcul pour écrire ces partitions séquentiellement dans un seul fichier. Ce n'est pas difficile à faire, mais peut provoquer un peu de sauvegarde sur le planificateur.

Édition 1: (Le 23 octobre 2019)

Dans Dask 2.6.x, il existe un paramètre comme single_file. Par défaut, c'est False. Vous pouvez le définir True pour obtenir une sortie de fichier unique sans utiliser df.compute().

Par exemple:

df.to_csv('/path/to/myfiles.csv', single_file = True)

Référence: Documentation pour to_csv

22
MRocklin

vous pouvez convertir votre dataframe dask en un pandas dataframe avec la fonction compute puis utiliser le to_csv. quelque chose comme ça:

df_dask.compute (). to_csv ('csv_path_file.csv')

2
Fernando Siqueira