入门#
Arrow 在数组中管理数据 (pyarrow.Array
),这些数组可以分组到表格中 (pyarrow.Table
) 以表示表格数据中的数据列。
Arrow 还提供了对各种格式的支持,以便将这些表格数据读入和读出磁盘和网络。最常用的格式是 Parquet (读取和写入 Apache Parquet 格式) 和 IPC 格式 (流式处理、序列化和 IPC)。
创建数组和表格#
Arrow 中的数组是统一类型数据的集合。这允许 Arrow 使用性能最佳的实现来存储数据并在其上执行计算。因此,每个数组都应包含数据和类型。
In [1]: import pyarrow as pa
In [2]: days = pa.array([1, 12, 17, 23, 28], type=pa.int8())
多个数组可以组合在表格中,在附加到列名时形成表格数据中的列。
In [3]: months = pa.array([1, 3, 5, 7, 1], type=pa.int8())
In [4]: years = pa.array([1990, 2000, 1995, 2000, 1995], type=pa.int16())
In [5]: birthdays_table = pa.table([days, months, years],
...: names=["days", "months", "years"])
...:
In [6]: birthdays_table
Out[6]:
pyarrow.Table
days: int8
months: int8
years: int16
----
days: [[1,12,17,23,28]]
months: [[1,3,5,7,1]]
years: [[1990,2000,1995,2000,1995]]
有关更多详细信息,请参阅 数据类型和内存数据模型。
保存和加载表格#
有了表格数据后,Arrow 提供了开箱即用的功能,可以将这些数据保存到常见的格式(如 Parquet)中并恢复它们。
In [7]: import pyarrow.parquet as pq
In [8]: pq.write_table(birthdays_table, 'birthdays.parquet')
将数据保存到磁盘后,只需调用一个函数即可将其加载回来,而 Arrow 针对内存和速度进行了大量优化,因此加载数据将尽可能快。
In [9]: reloaded_birthdays = pq.read_table('birthdays.parquet')
In [10]: reloaded_birthdays
Out[10]:
pyarrow.Table
days: int8
months: int8
years: int16
----
days: [[1,12,17,23,28]]
months: [[1,3,5,7,1]]
years: [[1990,2000,1995,2000,1995]]
在箭头中保存和加载数据通常是通过 Parquet、IPC 格式 (Feather 文件格式)、CSV 或 行分隔 JSON 格式完成的。
执行计算#
Arrow 附带了一系列可以应用于其数组和表格的计算函数,因此可以通过计算函数对数据应用转换。
In [11]: import pyarrow.compute as pc
In [12]: pc.value_counts(birthdays_table["years"])
Out[12]:
<pyarrow.lib.StructArray object at 0x7f1563488fa0>
-- is_valid: all not null
-- child 0 type: int16
[
1990,
2000,
1995
]
-- child 1 type: int64
[
1,
2,
2
]
有关可用计算函数及其使用方法的列表,请参阅 计算函数。
使用大型数据#
Arrow 还提供 pyarrow.dataset
API 来处理大型数据,该 API 将为您处理数据的分割成更小的块。
In [13]: import pyarrow.dataset as ds
In [14]: ds.write_dataset(birthdays_table, "savedir", format="parquet",
....: partitioning=ds.partitioning(
....: pa.schema([birthdays_table.schema.field("years")])
....: ))
....:
加载回分区数据集将检测这些块。
In [15]: birthdays_dataset = ds.dataset("savedir", format="parquet", partitioning=["years"])
In [16]: birthdays_dataset.files
Out[16]:
['savedir/1990/part-0.parquet',
'savedir/1995/part-0.parquet',
'savedir/2000/part-0.parquet']
并且将在迭代时延迟加载数据块。
In [17]: import datetime
In [18]: current_year = datetime.datetime.utcnow().year
In [19]: for table_chunk in birthdays_dataset.to_batches():
....: print("AGES", pc.subtract(current_year, table_chunk["years"]))
....:
AGES [
34
]
AGES [
29,
29
]
AGES [
24,
24
]
有关如何使用大型数据集、如何筛选它们、如何投影它们等的更多详细信息,请参阅 表格数据集 文档。
从此处继续#
要深入了解 Arrow,您可能需要阅读 PyArrow 文档 本身或 Arrow Python 食谱