Mis a jour le 2026-02-01, 20:19

pyarrow

Package de manipulation de tableaux orienté colonne, comme parquet.
Import :
import pyarrow
import pyarrow.parquet
  
col = pyarrow.array([1, 2, 3, 4], type = pyarrow.int8()) : crée un objet pyarrow avec des valeurs du type indiqué :
  • len(col) : la tallle de la colonne (ici, 4)
  • col[0:2] : récupération des 2 premières valeurs de la colonnne.
  • les données sont non mutables.
On peut avoir des valeurs null : col = pyarrow.array([1, None, 2], pyarrow.float16()) :
  • col.null_count : le nombre de null dans la colonne.
Les types possibles :
  • int8, int16, int32, int64, float16, float32, float64, string, binary
  • on peut avoir un format binary de taille fixe : col = pyarrow.array([bytes('abc', encoding = 'ascii'), bytes('def', encoding = 'ascii')], type = pyarrow.binary(3))
  • on peut avoir un type liste : col = pyarrow.array([[1, 2], [3, 4, 5]], type = pyarrow.list_(pyarrow.int8()))
  • on peut avoi des valeurs avec plusieurs champs (struct) : col = pyarrow.array([(1, 2.1), (2, 3.7)], type = pyarrow.struct([('param1', pyarrow.int8()), ('param2', pyarrow.float16())]))
  • StructArray : col = pyarrow.array([{'a': 1, 'b': 2.4}, {'b': 7.1, 'c': 'test'}])
On peut combiner des arrays pour faire des tables :
  • col1 = pyarrow.array([1, 2, 3, 4], type = pyarrow.int8())
    col2 = pyarrow.array([1.2, 5.6, 3.2, 2.5], type = pyarrow.float16())
    myTable = pyarrow.table([col1, col2], names = ['param1', 'param2'])
        
  • myTable.schema : objet Schema qui indique le nom des colonnes et leur type.
  • myTable.schema.names : le nom des champs.
  • myTable.schema.field('param1') : un objet Field qui a les propriétés name et type.
RecordBatch :
  • val1 = pyarrow.array([1, 2, 3, 4], type = pyarrow.int8())
    val2 = pyarrow.array([1.2, 5.6, 3.2, 2.5], type = pyarrow.float16())
    myRecordBatch = pyarrow.RecordBatch.from_arrays([val1, val2], ['param1', 'param2'])
        
  • la différence entre un RecordBatch et une Table : un RecordBatch est un petit set de rows de taille fixé alors qu'une Table est l'ensemble des rows.
  • myTable = pyarrow.Table.from_batches([myRecordBatch1, myRecordBatch2]) : permet de construire une Table à partir de RecordBatch (la table apparait avec des chunk (groupes de rows), mais si on la sauvegarde dans un fichier et qu'on la reloade, plus de chunks).
Ecriture/Lecture :
  • pyarrow.parquet.write_table(myTable, 'myTable.parquet') : permet de sauver la table au format parquet
  • myTable = pyarrow.parquet.read_table('myTable.parquet') : lecture de données.
  • pour des grands datasets, on peut splitter les données par groupe, ici split selon les valeurs de param2, avec un fichier par valeur :
    col1 = pyarrow.array([1, 2, 3, 4], type = pyarrow.int8())
    col2 = pyarrow.array(['a', 'b', 'a', 'b'], type = pyarrow.string())
    myTable = pyarrow.table([col1, col2], names = ['param1', 'param2'])
    pyarrow.dataset.write_dataset(myTable, 'dumpDir', format = 'parquet',
      partitioning = pyarrow.dataset.partitioning(pyarrow.schema([myTable.schema.field('param2')])))
        
On peut faire des calculs
  • Compter le nombre d'occurrences d'une valeur : col3 = pyarrow.array(['a', 'b', 'a', 'b', 'c', 'a'], type = pyarrow.string()); pyarrow.compute.value_counts(col3)

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert