開始使用#

Arrow 在陣列 (pyarrow.Array) 中管理資料,陣列可以分組在表格 (pyarrow.Table) 中,以表示表格化資料中的資料行。

Arrow 也為各種格式提供支援,以便將這些表格化資料匯入和匯出磁碟和網路。最常用的格式是 Parquet (讀取與寫入 Apache Parquet 格式) 和 IPC 格式 (串流、序列化與 IPC)。

建立陣列與表格#

Arrow 中的陣列是 uniform 類型資料的集合。這讓 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]]

在 Arrow 中儲存和重新載入資料通常透過 ParquetIPC 格式 (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 0x7fe3e543b760>
-- is_valid: all not null
-- child 0 type: int16
  [
    1990,
    2000,
    1995
  ]
-- child 1 type: int64
  [
    1,
    2,
    2
  ]

請參閱 計算函數 以取得可用計算函數的清單以及如何使用它們。

處理大型資料#

Arrow 也提供 pyarrow.dataset 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 [
  35
]
AGES [
  30,
  30
]
AGES [
  25,
  25
]

如需關於如何處理大型資料集、如何篩選它們、如何投影它們等的更多詳細資訊,請參閱 表格化資料集 文件。

從這裡繼續#

為了更深入研究 Arrow,您可能想要閱讀 PyArrow 文件 本身或 Arrow Python 食譜