> Modules non standards > Autres modules non standards > pyarrow
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