Arrow Flight 是 Apache Arrow 项目的一部分,是一个用于在网络接口上高性能传输大型数据集的通用客户端-服务器框架。它通过多种方式实现高效的数据传输:
- Flight 消除了数据传输过程中反序列化的需求。
- Flight 支持并行数据流传输。
- Flight 采用了旨在利用 Arrow 列式存储格式优势的优化技术。
arrow 包提供了连接到 Flight 服务器以发送和接收数据的方法。
先决条件
目前,R 中的 arrow 包尚未提供 Arrow Flight 的独立实现:它是通过调用 PyArrow Python 提供的 Flight 方法来工作的,因此需要安装 reticulate 包和 Python PyArrow 库。如果您是第一次使用它们,可以通过以下方式安装:
install.packages("reticulate")
arrow::install_pyarrow()有关设置 pyarrow 的更多详细信息,请参阅 python 集成文章。
示例
该包包含了启动基于 Python 的 Flight 服务器的方法,以及连接到在其他地方运行的 Flight 服务器的方法。为了演示这两方面,我们在一个 R 进程中启动一个演示服务器:
library(arrow)
demo_server <- load_flight_server("demo_flight_server")
server <- demo_server$DemoFlightServer(port = 8089)
server$serve()我们让它保持运行状态。
在另一个 R 进程中,让我们连接到它并放入一些数据。
library(arrow)
client <- flight_connect(port = 8089)
flight_put(client, iris, path = "test_data/iris")现在,在第三个 R 进程中,我们可以连接到服务器并拉取我们刚才放入的数据:
library(arrow)
library(dplyr)
client <- flight_connect(port = 8089)
client |>
flight_get("test_data/iris") |>
group_by(Species) |>
summarize(max_petal = max(Petal.Length))
## # A tibble: 3 x 2
## Species max_petal
## <fct> <dbl>
## 1 setosa 1.9
## 2 versicolor 5.1
## 3 virginica 6.9由于 flight_get() 返回的是一个 Arrow 数据结构,因此您可以直接将其结果通过管道传输到 dplyr 工作流中。有关通过 dplyr 接口使用 Arrow 对象的更多信息,请参阅关于 数据整理 (data wrangling) 的文章。
进一步阅读
- Flight 远程过程调用协议的规范列在 Arrow 项目主页上。
- Arrow C++ 文档包含一份关于 Arrow Flight 的最佳实践列表。
- Apache Arrow Python 食谱 (Cookbook) 中提供了关于 Python 中 Arrow Flight 服务器的详细工作示例。