更新日志
Source:NEWS.md
arrow 23.0.0
CRAN release: 2026-01-23
新功能
-
nchar()现在支持keepNA = FALSE(@HyukjinKwon, #48665)。 -
stringr::str_ilike()绑定,用于不区分大小写的模式匹配 (#48262)。
小的改进和修复
- 修复了读取具有大量列的文件时性能缓慢的问题 (#48104)。
- 修复了在
RecordBatch上调用concat_tables()时发生的段错误 (#47885)。 - 在 S3 上写入分区数据集不再需要
ListBucket权限 (@HaochengLIU, #47599)。
安装
- 从 23.0.0 版本开始,
arrow需要 C++20 才能从源码构建。这意味着您可能需要比某些旧系统的默认编译器更新的编译器。有关指导,请参阅vignette("install", package = "arrow")。
arrow 22.0.0
CRAN release: 2025-10-29
新功能
-
已实现
stringr::str_replace_na()绑定 (#47521)。
小的改进和修复
- 子秒时间变量不再在
hms::hms()绑定中被截断 (#47278)
arrow 21.0.0
CRAN release: 2025-07-24
小的改进和修复
- 在
S3FileSystem中公开了一个选项check_directory_existence_before_creation,以减少在云存储上的 I/O 调用 (@HaochengLIU, #41998)。 -
case_when()现在能正确检测不在全局环境中的对象 (@etiennebacher, #46667)。 - 负分数的日期现在通过取整值正确转换为整数 (#46873)。
- 已从 R 包中删除了对旧版 Arrow C++ 的向后兼容性检查 (#46491)。这不应该影响大多数用户,只会影响您在不同 R 包和 Arrow C++ 版本下从源码构建 R 包的情况。
- 在捆绑的构建脚本中要求 CMake 3.25 或更高版本才能进行全源码构建 (#46834)。这不应该影响大多数用户。
arrow 20.0.0
CRAN release: 2025-05-10
小的改进和修复
- 二进制数组在转换为 R 对象时,除了
arrow_binary外,现在还继承自blob::blob。此更改是最终弃用arrow_binary类并采用blob包中的blob类的第一步(参见 GH-45709)。
arrow 19.0.1
CRAN release: 2025-02-26
此版本主要更新了包使用的底层 Arrow C++ 版本到 19.0.1,并包含 19.0.0 和 19.0.1 版本的所有更改。关于 Arrow C++ 19.0.0 的更改,请参阅 博客文章和 变更日志。关于 Arrow C++ 19.0.1 的更改,请参阅 博客文章和 变更日志。
arrow 17.0.0
CRAN release: 2024-08-17
新功能
- 用户编写的、使用 Arrow 支持的函数进行数据集查询的 R 函数现在也可以在查询中使用。以前,只有使用算术运算符的函数才有效。例如,
time_hours <- function(mins) mins / 60可以工作,但time_hours_rounded <- function(mins) round(mins / 60)不可以;现在两者都可以。这些是自动翻译,而非真正的用户定义函数(UDF);有关 UDF,请参阅register_scalar_function()。( #41223) -
mutate()表达式现在可以包含聚合,例如x - mean(x)。( #41350) -
summarize()支持更复杂的表达式,并能正确处理列名在表达式中被重用的情况。( #41223) - 现在支持
dplyr::*_join()函数的na_matches参数。此参数控制在连接时是否将NA值视为相等。( #41358) - 用于支持 R 和 Arrow/Parquet 之间数据往返的 Arrow schema 中的 R 元数据,现在被更严格地序列化和反序列化。这使得从未知来源的文件加载数据到 R data.frames 更安全。( #41969)
arrow 16.1.0
CRAN release: 2024-05-25
小的改进和修复
- 数据集和表输出打印现在会将超过 20 个项目的 schema 截断 (#38916)
- 修复了指针到 Python 的转换,以支持最新的 reticulate,确保数据可以在 Arrow 和 PyArrow 之间传递 (#39969)
- 在 macOS 上检查是否使用了 GNU libtool,并确保使用 macOS libtool 代替 (#40259)
- 修复了在 Windows 上创建包含所有依赖项的捆绑 tarball 时出现错误的 bug (@hutch3232, #40232)
arrow 15.0.1
CRAN release: 2024-03-12
小的改进和修复
- 当 ARROW_OFFLINE_BUILD=true 时,不下载 cmake 并更新
SystemRequirements(#39602)。 - 如果二进制下载失败,则优雅地回退到源码构建 (#39587)。
- 当
sub,gsub,stringr::str_replace,stringr::str_replace_all的pattern参数传递一个长度大于 1 的值向量时,会抛出错误而不是警告并拉取数据到 R (@abfleishman, #39219)。 - 为
?open_dataset添加了缺失的文档,说明如何使用 arrow 13.0.0 中添加的 ND-JSON 支持 (@Divyansh200102, #38258)。 - 为了方便使用 arrow 与 AWS S3(例如,
s3_bucket,S3FileSystem)进行调试,S3 的调试日志级别可以通过环境变量AWS_S3_LOG_LEVEL设置。有关更多信息,请参阅?S3FileSystem。( #38267) - 使用 arrow 与 duckdb(例如,
to_duckdb())不再会导致在退出 R 会话时出现警告。( #38495) - 修复了大量小的拼写错误 (@jsoref, #38929, #38257)
- 开发者文档已更新,以匹配近期版本中的更改 (#38220)
arrow 14.0.0
CRAN release: 2023-11-16
新功能
- 读取分区 CSV 数据集并向
open_dataset()提供 schema 时,分区变量现在会包含在结果数据集中 (#37658)。 - 新函数
write_csv_dataset()现在包装了write_dataset()并模仿了write_csv_arrow()的语法 (@dgreiss, #36436)。 -
open_delim_dataset()现在接受quoted_na参数,将空字符串解析为 NA 值 (#37828)。 -
现在可以对
data.frame对象调用schema()来获取其推断的 Arrow schema (#37843)。 - 将逗号或其他字符作为小数分隔符的 CSV 现在可以被数据集读取函数和新函数
read_csv2_arrow()读取 (#38002)。
小的改进和修复
CsvParseOptions对象创建的文档现在包含有关默认值的更多信息 (@angela-li, #37909)。- 修复了一个可能导致在失败分配后从非 R 线程调用 R 代码的代码路径 (#37565)。
- 修复了无法从 R 连接读取大型 Parquet 文件的 bug (#37274)。
- 现在,字符串帮助函数(例如,
fixed(),regex()等)的绑定允许在参数中可靠地使用变量 (#36784)。 - Thrift 字符串和容器大小限制现在可以通过新公开的
ParquetReaderProperties进行配置,允许用户处理具有异常大元数据的 Parquet 文件 (#36992)。 - 使用
add_filename()导致的错误消息已得到改进 (@amoeba, #37372)。
安装
- macOS 构建现在使用与 Linux 相同的安装路径 (@assignUser, #37684)。
- 在 macOS 上运行模拟(例如,在 M1/aarch64 上使用 x86 R 版本)时,在加载包时会发出警告信息(#37777)。
- 在配置和安装期间运行的 R 脚本现在使用正确的 R 解释器运行 (@meztez, #37225)。
- 失败的 libarrow 构建现在返回更详细的输出 (@amoeba, #37727)。
-
create_package_with_all_dependencies()现在能在 Windows 上正确转义路径 (#37226)。
arrow 13.0.0
CRAN release: 2023-08-30
破坏性更改
- 仅继承自
data.frame而不继承自其他类的输入对象现在会删除class属性,从而始终从文件读取函数和arrow_table()返回 tibble,从而使返回对象的类型保持一致。对 Arrow Tabular 对象调用as.data.frame()现在始终返回data.frame对象 (#34775)
新功能
-
open_dataset()现在支持 ND-JSON 文件 (#35055) - 对多个 Arrow 对象调用
schema()现在会返回对象的 schema (#35543) - 在 arrow 实现的 dplyr 动词中现在支持 dplyr
.by/by参数 (@eitsupi, #35667) dplyr::case_when()的绑定现在接受.default参数,以匹配 dplyr 1.1.0 中的更新 (#35502)
小的改进和修复
- 便利函数
arrow_array()可用于创建 Arrow 数组 (#36381) - 便利函数
scalar()可用于创建 ArrowScalars (#36265) - 通过始终从主 R 线程调用 DuckDB 的
RecordBatchReader::ReadNext()来防止 arrow 和 duckdb 之间传递数据时崩溃 (#36307) - 为
set_io_thread_count()提供了num_threads< 2 的警告 (#36304) - 确保缺失的分组变量被添加到变量列表的开头 (#36305)
- CSV 文件读取器选项类对象可以打印选定的值 (#35955)
- Schema 元数据可以设置为命名字符向量 (#35954)
- 确保 RStringViewer 辅助类不拥有任何 Array 引用 (#35812)
-
arrow 中的
strptime()如果%z是格式字符串的一部分,则返回时区感知的 timestamp (#35671) - 合并
group_by()和across()时的列顺序现在与 dplyr 匹配 (@eitsupi, #35473)
arrow 12.0.0
CRAN release: 2023-05-05
新功能
read_parquet()和read_feather()函数现在可以接受 URL 参数 (#33287, #34708)。GcsFileSystem$create()中的json_credentials参数现在接受包含相应身份验证令牌的文件路径 (@amoeba, #34421, #34524)。- 现在可以检查
GcsFileSystem对象的$options成员 (@amoeba, #34422, #34477)。 read_csv_arrow()和read_json_arrow()函数现在接受用I()包装的文字文本输入,以提高与readr::read_csv()的兼容性 (@eitsupi, #18487, #33968)。- 嵌套字段现在可以使用 dplyr 表达式中的
$和[[进行访问 (#18818, #19706)。
小的改进和修复
- 修复了与 S3 文件系统组件最终化相关的进程退出时发生的崩溃 (#15054, #33858)。
- 实现 Arrow C++ 的
FetchNode和OrderByNode,以提高性能并简化从 dplyr 表达式构建查询计划 (#34437, #34685)。 - 修复了在
arrow_table()中因细微的参数传递语义不同而写入不同 R 元数据的 bug (#35038, #35039)。 - 改进了在尝试将具有
NULL列名的data.frame转换为Table时出现的错误消息 (#15247, #34798)。 - vignettes 已更新,以反映
open_csv_dataset()系列函数中的改进 (#33998, #34710)。 - 修复了当 arrow ALTREP 向量被物化并转换回 arrow Arrays 时发生的崩溃 (#34211, #34489)。
- 改进了 conda 安装说明 (#32512, #34398)。
- 改进了文档 URL 配置 (@eitsupi, #34276)。
- 更新了迁移到 GitHub 的 JIRA 问题链接 (@eitsupi, #33631, #34260)。
dplyr::n()函数现在映射到count_allkernel,以提高性能并简化 R 实现 (#33892, #33917)。- 改进了使用
s3_bucket()文件系统助手与endpoint_override的体验,并修复了传递某些参数组合时出现的意外行为 (@cboettig, #33904, #34009)。 - 在
open_csv_dataset()中提供了 schema 和col_names = TRUE时,不引发错误 (#34217, #34092)。
arrow 11.0.0.3
CRAN release: 2023-03-08
小的改进和修复
-
open_csv_dataset()允许指定 schema。( #34217) - 为了确保与即将发布的 dplyr 版本兼容,我们不再调用
dplyr:::check_names()(#34369)
arrow 11.0.0.2
CRAN release: 2023-02-12
重大变更
-
map_batches()默认是惰性的;它现在返回一个RecordBatchReader而不是RecordBatch对象列表,除非设置了lazy = FALSE。(#14521)
新功能
文档
- 对许多 vignette 和 README 进行了大量的重组、重写和补充。(@djnavarro, #14514)
读/写数据
- 新增函数
open_csv_dataset(),open_tsv_dataset(), 和open_delim_dataset()都封装了open_dataset()——它们没有提供新功能,但允许提供类 readr 的选项,从而更轻松地在单个文件读取和数据集功能之间切换。(#33614) - 在写入 CSV 文件(作为数据集或单个文件)时,可以设置用户自定义的空值。(@wjones127, #14679)
- 新的
col_names参数允许在打开 CSV 数据集时指定列名。(@wjones127, #14705) parse_options,read_options, 和convert_options参数现在可以作为列表传递给读取单个文件(read_*_arrow()函数)和数据集(open_dataset()和新的open_*_dataset()函数)。(#15270)read_csv_arrow()可以读取包含重音字符的文件路径。(#14930)
dplyr 兼容性
- 实现了新的 dplyr (1.1.0) 函数
join_by(),用于在 Arrow 对象上进行 dplyr 连接(仅限相等条件)。(#33664) - 使用多个
dplyr::group_by()/dplyr::summarise()调用时,输出准确。(#14905) -
当除数是变量时,
dplyr::summarize()可以进行除法运算。(#14933) -
dplyr::right_join()正确地合并键。(#15077) - 进行多项更改以确保与 dplyr 1.1.0 兼容。(@lionel-, #14948)
arrow 10.0.1
CRAN 发布:2022-12-06
小的改进和修复
- 修复了在 lubridate 1.9 发布后导致测试失败的问题(#14615)
- 更新以确保与开发版 purrr 中的更改兼容(#14581)
- 修复了在
dplyr::group_by()中正确处理.data代词(#14484)
arrow 10.0.0
CRAN 发布:2022-10-26
Arrow dplyr 查询
可以在查询中使用几个新函数
-
dplyr::across()可用于将相同的计算应用于多个列,并且across()中支持where()选择助手; -
add_filename()可用于获取行来自的文件名(仅在查询?Dataset时可用); - 添加了
slice_*系列的五个函数:dplyr::slice_min(),dplyr::slice_max(),dplyr::slice_head(),dplyr::slice_tail(), 和dplyr::slice_sample()。
包现在有文档记录了所有在 Arrow 数据上受支持的 dplyr 方法和 R 函数映射,以及关于 Acero(Arrow 查询引擎)中评估的查询与在 R 中评估的查询之间功能差异的说明。请参阅 ?acero。
为连接实现了一些新功能和错误修复
- 连接现在支持扩展数组,例如,允许连接包含 geoarrow 数据的数据集。
- 现在支持
keep参数,允许在连接输出中为左右连接键保留单独的列。当keep = FALSE时,完全连接现在会合并连接键,避免了右侧没有匹配左侧的行时连接键全部为NA的问题。
一些更改以提高 API 的一致性
- 在未来的版本中,调用
dplyr::pull()默认将返回一个?ChunkedArray而不是 R 向量。当前的默认行为已被弃用。要立即更新到新行为,请指定pull(as_vector = FALSE)或全局设置options(arrow.pull_as_vector = FALSE)。 - 对分组的查询调用
dplyr::compute()现在返回一个?Table而不是一个查询对象。
最后,现在可以取消长时间运行的查询,它们将立即中止计算。
数组和表
as_arrow_array() 现在可以接受 blob::blob 和 ?vctrs::list_of,它们分别转换为二进制数组和列表数组。还修复了一个问题,即当向 StructArray 传递类型参数时,as_arrow_array() 会忽略该参数。
函数 unique() 现在可以在 ?Table, ?RecordBatch, ?Dataset, 和 ?RecordBatchReader 上使用。
读写
write_feather() 可以接受 compression = FALSE 以选择写入未压缩的文件。
此外,write_dataset() 对 IPC 文件有一个破坏性更改:向 format 传递 "ipc" 或 "feather" 现在将写入扩展名为 .arrow 的文件,而不是 .ipc 或 .feather。
安装
从 10.0.0 版本开始,arrow 需要 C++17 才能构建。这意味着
- 在 Windows 上,你需要
R >= 4.0。9.0.0 版本是最后一个支持 R 3.6 的版本。 - 在 CentOS 7 上,你可以构建最新版本的
arrow,但你需要先安装比默认系统编译器(gcc 4.8)更新的编译器。请参阅vignette("install", package = "arrow")获取指南。请注意,你只需要较新的编译器来构建arrow:安装二进制包(如从 RStudio Package Manager 安装),或加载你已安装的包,使用系统默认设置工作正常。
arrow 9.0.0
CRAN 发布:2022-08-10
Arrow dplyr 查询
- 新的 dplyr 动词
-
dplyr::union和dplyr::union_all(#13090) -
dplyr::glimpse(#13563) -
可以将
show_exec_plan()添加到 dplyr 流水线的末尾,以显示底层计划,类似于dplyr::show_query()。dplyr::show_query()和dplyr::explain()也可以工作并显示相同输出,但未来可能会更改。(#13541)
-
- 查询中支持用户定义函数。使用
register_scalar_function()创建它们。(#13397) -
map_batches()返回一个RecordBatchReader,并要求它映射的函数通过as_record_batch()S3 函数返回可强制转换为RecordBatch的内容。如果传入.lazy = TRUE,它也可以以流式方式运行。(#13170, #13650) - 现在可以在查询中使用带包命名空间前缀的函数(例如
stringr::,lubridate::)。例如,stringr::str_length现在将分派到与str_length相同的内核。(#13160) - 支持新函数
-
lubridate::parse_date_time()datetime 解析器:(#12589, #13196, #13506)-
支持带有年、月、日、小时、分钟和秒分量的
orders。 - Arrow 绑定中的
orders参数的工作方式如下:orders被转换为formats,然后依次应用。没有select_formats参数,也不进行推断(就像lubridate::parse_date_time()中的情况一样)。
-
支持带有年、月、日、小时、分钟和秒分量的
-
lubridate日期和日期时间解析器,例如lubridate::ymd(),lubridate::yq(), 和lubridate::ymd_hms()(#13118, #13163, #13627) -
lubridate::fast_strptime()(#13174) -
lubridate::floor_date(),lubridate::ceiling_date(), 和lubridate::round_date()(#12154) -
strptime()支持tz参数以传递时区。(#13190) -
lubridate::qday()(季度日) -
exp()和sqrt()。(#13517)
-
- 错误修复
读写
- 新增函数
read_ipc_file()和write_ipc_file()。这些函数几乎与read_feather()和write_feather()相同,但不同之处在于它们只针对 IPC 文件(Feather V2 文件),而不是 Feather V1 文件。 -
read_arrow()和write_arrow()自 1.0.0 (2020 年 7 月) 起已弃用,现已移除。请使用read_ipc_file()和write_ipc_file()替代 IPC 文件,或使用read_ipc_stream()和write_ipc_stream()替代 IPC 流。(#13550) -
write_parquet()现在默认写入 Parquet 格式版本 2.4(之前是 1.0)。先前已弃用的参数properties和arrow_properties已被移除;如果你需要直接处理这些低级属性对象,请使用ParquetFileWriter,write_parquet()会包装它。(#13555) - UnionDatasets 可以统一具有不同模式的多个 InMemoryDatasets 的模式。(#13088)
-
write_dataset()再次保留所有模式元数据。在 8.0.0 版本中,它会丢弃大部分元数据,这会破坏如 sfarrow 等包。(#13105) - 读写函数(如
write_csv_arrow())如果文件路径包含压缩扩展名(例如"data.csv.gz"),将自动(解)压缩数据。这在本地以及 S3 和 GCS 等远程文件系统上都有效。(#13183) -
可以将
FileSystemFactoryOptions提供给open_dataset(),允许你传递忽略哪些文件前缀等选项。(#13171) - 默认情况下,
S3FileSystem不会创建或删除桶。要启用此功能,请传递配置选项allow_bucket_creation或allow_bucket_deletion。(#13206) -
GcsFileSystem和gs_bucket()允许连接到 Google Cloud Storage。(#10999, #13601)
打包
- R 包的夜间构建和预构建 libarrow 二进制文件的
arrow.dev_repo现在是 https://nightlies.apache.org/arrow/r/。 - macOS 二进制文件附带 Brotli 和 BZ2。Windows 二进制文件附带 BZ2。(#13484)
arrow 8.0.0
CRAN 发布:2022-05-09
对 dplyr 和数据集的增强
-
open_dataset():- 正确支持 CSV 数据集中的
skip参数以跳过标题行。 - 可以接受数据集列表,这些列表具有不同的模式,并尝试统一模式以生成
UnionDataset。
- 正确支持 CSV 数据集中的
- Arrow dplyr 查询
- 在
RecordBatchReader上受支持。这允许例如将 DuckDB 的结果流式传输回 Arrow,而不是在继续流水线之前将它们具体化。 - 如果查询包含聚合或连接,则不再需要在写入数据集之前具体化整个结果表。
- 支持
dplyr::rename_with()。 -
dplyr::count()返回一个未分组的数据框。
- 在
-
write_dataset()在写入分区数据集时有更多选项来控制行组和文件大小,例如max_open_files,max_rows_per_file,min_rows_per_group, 和max_rows_per_group。 -
write_csv_arrow()接受Dataset或 Arrow dplyr 查询。 - 当
option(use_threads = FALSE)时,连接一个或多个数据集不再导致 R 崩溃。该选项在 Windows 上是默认设置。 -
dplyr连接支持suffix参数来处理列名重叠。 - 使用
is.na()过滤 Parquet 数据集不再会遗漏任何行。 -
map_batches()正确接受Dataset对象。
日期和时间支持的增强
-
read_csv_arrow()的 readr 风格类型T映射到timestamp(unit = "ns")而不是timestamp(unit = "s")。 - 对于 Arrow dplyr 查询,添加了额外的 lubridate 功能和修复
- 新的组件提取函数
-
lubridate::tz()(时区), -
lubridate::semester(), -
lubridate::dst()(夏令时布尔值), -
lubridate::date(), -
lubridate::epiyear()(根据流行病周日历的年份),
-
-
lubridate::month()适用于整数输入。 -
lubridate::make_date()和lubridate::make_datetime()+base::ISOdatetime()和base::ISOdate()从数字表示创建日期时间。 -
lubridate::decimal_date()和lubridate::date_decimal() -
lubridate::make_difftime()(持续时间构造函数) -
?lubridate::duration帮助函数,例如lubridate::dyears(),lubridate::dhours(),lubridate::dseconds()。 lubridate::leap_year()-
lubridate::as_date()和lubridate::as_datetime()
- 新的组件提取函数
- 此外,对于 Arrow dplyr 查询,添加了对基本日期和时间函数的支持和修复
-
base::difftime和base::as.difftime() -
base::as.Date()用于转换为日期 - Arrow 时间戳和日期数组支持
base::format() -
strptime()在格式不匹配时返回NA而不是出错,就像base::strptime()一样。
-
- 在安装了 tzdb 包的情况下,Windows 支持时区操作。
可扩展性
- 为主要的 Arrow 对象添加了 S3 泛型转换函数,如
as_arrow_array()和as_arrow_table()。这包括 Arrow 表、记录批次、数组、块状数组、记录批次读取器、模式和数据类型。这允许其他包定义从其类型到 Arrow 对象的自定义转换,包括扩展数组。 - 可以创建和注册自定义 扩展类型和数组,允许其他包定义自己的数组类型。扩展数组封装了常规的 Arrow 数组类型,并提供定制的行为和/或存储。请参阅
?new_extension_type的描述和示例。 - 为所有
vctrs::vec_is()返回 TRUE 的对象(即可以用作tibble::tibble()列的任何对象)实现了泛型扩展类型和 as_arrow_array() 方法,前提是底层vctrs::vec_data()可以转换为 Arrow 数组。
连接支持
Arrow 数组和表可以轻松连接
- 数组可以使用
concat_arrays()连接,如果需要零拷贝且可以接受分块,则可以使用ChunkedArray$create()连接。 - ChunkedArrays 可以使用
c()连接。 - RecordBatches 和 Tables 支持
cbind()。 - Tables 支持
rbind()。还提供了concat_tables()来连接表并统一模式。
其他改进和修复
- 字典数组在转换为 R 因子时支持使用 ALTREP。
- 为 ArrowDatum 实现了数学组泛型。这意味着你可以对 Arrow 数组和标量使用基础函数,如
sqrt(),log(), 和exp()。 -
read_*和write_*函数支持 R Connection 对象来读取和写入文件。 - Parquet 改进
- Parquet 写入器支持 Duration 类型列。
- 数据集 Parquet 读取器消耗更少的内存。
-
median()和quantile()只会警告一次关于近似计算,而与交互性无关。 -
Array$cast()可以将 StructArrays 强制转换为具有相同字段名称和结构(或字段子集)但字段类型不同的另一种结构类型。 - 移除了对 Solaris 的特殊处理。
- CSV 写入器在写入字符串列时速度更快。
- 修复了一个问题,即
set_io_thread_count()会设置 CPU 计数而不是 IO 线程计数。 -
RandomAccessFile有一个$ReadMetadata()方法,提供文件系统提供的有用元数据。 -
grepl绑定对NA输入返回FALSE(以前返回NA),以匹配base::grepl()的行为。 -
create_package_with_all_dependencies()在 Windows 和 Mac OS 上工作,而不再仅在 Linux 上工作。
arrow 7.0.0
CRAN 发布:2022-02-10
对 dplyr 和数据集的增强
- 更多的 lubridate 功能:已实现
week()、更多的is.*()函数以及month()中的label参数。 - 支持
summarize()中的更复杂表达式,例如ifelse(n() > 1, mean(y), mean(z))。 - 在 dplyr 管道中添加列时,现在可以使用
tibble和data.frame分别创建包含 tibble 或 data.frame 的列(例如... %>% mutate(df_col = tibble(a, b)) %>% ...)。 coalesce()中支持字典列(Rfactor类型)。-
open_dataset()在读取 Hive 风格分区文件时接受partitioning参数,即使它不是必需的。 - 用于对数据集执行自定义操作的实验性函数
map_batches()已恢复。
CSV
- 现在可以读取除 UTF 以外的其他编码的定界文件(包括 CSVs)(在读取时使用
encoding参数)。 -
open_dataset()正确忽略 CSV 中的字节序标记 (BOM),这与读取单个文件时的情况相同。 - 读取数据集默认使用异步扫描器,这解决了读取大型 CSV 数据集时潜在的死锁问题。
-
head()在大型 CSV 数据集上不再挂起。 - 当文件中的标题与作为参数提供的 schema/列名之间存在冲突时,会提供改进的错误消息。
-
write_csv_arrow()现在遵循readr::write_csv()的签名。
其他改进和修复
- 许多 vignette 经过重新组织、重构和扩展,以提高其可用性和清晰度。
- 用于生成 schema(以及单个数据类型规范)的代码可以通过
schema或type上的$code()方法访问。这使您可以轻松获取从已具有 schema 的对象创建 schema 所需的代码。 - Arrow
Duration类型已映射到 R 的difftime类。 - 支持
decimal256()类型。decimal()函数已修订,根据precision参数的值,调用decimal256()或decimal128()。 -
write_parquet()使用对chunk_size的合理猜测,而不是总是写入单个块。这提高了读取和写入大型 Parquet 文件的速度。 -
write_parquet()不再丢弃分组 data.frame 的属性。 - 现在使用 ALTREP 支持分块数组。
- 由 Arrow 数组支持的 ALTREP 向量在排序或取反时不再被意外修改。
- 可以使用
proxy_options创建 S3 文件系统。 - 修复了创建 S3 文件系统时出现的段错误。
- Arrow 中的整数除法更接近 R 的行为。
安装
- 源构建默认使用
pkg-config搜索系统依赖项(如libz)并在存在时链接它们。这个新的默认设置将使在已安装这些依赖项的系统上从源构建 Arrow 变得更快。要保留以前的通过下载和构建所有依赖项的行为,请设置ARROW_DEPENDENCY_SOURCE=BUNDLED。 - Snappy 和 lz4 压缩库在 Linux 构建中默认启用。这意味着在不设置任何环境变量的情况下,Arrow 的默认构建将能够读取和写入 snappy 编码的 Parquet 文件。
- Windows 二进制包包含 brotli 压缩支持。
- 在 Windows 上构建 Arrow 可以找到本地构建的 libarrow 库。
- 该包在 Raspberry Pi OS 上编译和安装。
arrow 6.0.1
CRAN 发布日期:2021-11-20
- Join 操作现在支持包含字典列,并修复了多个崩溃问题
- 当处理已筛选到 0 行的数据时,分组聚合不再崩溃
- 为 dplyr 查询中的
str_count()添加了绑定 - 为 AWS C++ SDK 中的一个关键错误(可能影响 S3 multipart 上传)提供了解决方法
- 解决了 round 内核中的一个 UBSAN 警告
- 修复了 Solaris 和旧版 macOS 上的构建失败问题
arrow 6.0.0
现在有两种查询 Arrow 数据的方式
1. 扩展的 Arrow 原生查询:聚合和连接
dplyr::summarize()(分组和未分组)现在已在 Arrow Datasets、Tables 和 RecordBatches 上实现。由于数据是分块扫描的,因此您可以对由许多文件支持的大于内存的数据集进行聚合。支持的聚合函数包括 n()、n_distinct()、min()、max()、sum()、mean()、var()、sd()、any() 和 all()。也支持使用 t-digest 算法返回近似结果的 median() 和具有一个概率的 quantile()。
除了 summarize(),您还可以调用 count()、tally() 和 distinct(),它们有效地包装了 summarize()。
此增强确实在某些情况下更改了 summarize() 和 collect() 的行为:有关详细信息,请参阅下面的“破坏性更改”。
除了 summarize() 之外,还可以在 Arrow 中原生支持突变和过滤等值连接(inner_join()、left_join()、right_join()、full_join()、semi_join() 和 anti_join())。
在此版本中,分组聚合和(尤其是)连接应被视为具有实验性。我们期望它们能够工作,但它们可能没有针对所有工作负载进行充分优化。为了帮助我们在下一个版本中集中精力改进它们,如果您遇到意外行为或性能不佳的情况,请告知我们。
新的非聚合计算函数包括字符串函数,如 str_to_title() 和 strftime(),以及用于从日期中提取日期部分的计算函数(例如 year()、month())。这不是附加计算函数的完整列表;有关可用计算函数的详尽列表,请参阅 list_compute_functions()。
我们还努力为先前版本中添加的函数(例如 Decimal)填补对所有数据类型的支持。以前版本说明中提到的所有类型限制应不再有效,如果您发现某个函数未为特定数据类型实现,请 报告问题。
2. DuckDB 集成
如果您安装了 duckdb 包,您可以使用 to_duckdb() 函数将 Arrow Dataset 或查询对象交给 DuckDB 进行进一步查询。这允许您使用 duckdb 的 dbplyr 方法及其 SQL 接口来聚合数据。在 to_duckdb() 之前完成的过滤和列投影在 Arrow 中求值,并且 duckdb 也可以将某些谓词下推到 Arrow。这种交接**不**会复制数据,而是使用 Arrow 的 C 接口(就像在 R 和 Python 之间传递 arrow 数据一样)。这意味着不会产生序列化或数据复制成本。
您还可以获取一个 duckdb tbl 并调用 to_arrow() 将数据流式传输到 Arrow 的查询引擎。这意味着在一个 dplyr 管道中,您可以从 Arrow Dataset 开始,在 DuckDB 中评估一些步骤,然后评估其余部分在 Arrow 中。
破坏性更改
- 来自 Dataset 查询的数据的行顺序不再是确定的。如果您需要稳定的排序顺序,应明确
arrange()查询结果。对于对summarize()的调用,您可以设置options(arrow.summarise.sort = TRUE)以匹配当前dplyr按分组列排序的行为。 -
对内存中的 Arrow Table 或 RecordBatch 调用
dplyr::summarize()不再急切求值。调用compute()或collect()来求值查询。 -
head()和tail()也不再急切求值,无论是对于内存中的数据还是对于 Datasets。此外,由于行顺序不再是确定的,除非您arrange()指定排序,否则它们将有效地为您提供数据集中某个位置的随机切片。 - 简单特征 (SF) 列在转换为 Arrow 表时(以及因此在保存到 Parquet 或 Feather 时)不再保存其所有元数据。这还包括任何在每个元素上都有属性的 dataframe 列(换句话说:行级元数据)。我们以前保存此元数据的方法在计算上效率低下且在与 Arrow 查询 + 数据集一起使用时不可靠。这将最主要影响 SF 列的保存。对于保存这些列,我们建议将列转换为众所周知的二进制表示形式(使用
sf::st_as_binary(col))或使用 sfarrow 包,该包处理此转换过程的一些复杂性。我们计划改进这一点,并在将来以安全有效的方式实现保存时重新启用此类自定义元数据。如果您需要保留保存此元数据的 6.0.0 之前的行为,可以设置options(arrow.preserve_row_level_metadata = TRUE)。我们将在即将发布的版本中删除此选项。我们强烈建议尽可能避免使用此解决方法,因为结果将来不受支持,并可能导致令人惊讶和不准确的结果。如果您遇到除 sf 列之外的受此影响的自定义类,请 报告问题。 - 正式不再支持在 R < 4.0(Rtools 3.5)的 32 位 Windows 上使用 Datasets。32 位 Windows 用户应升级到新版本的 R 才能使用 Datasets。
Linux 上的安装
- 如果 Arrow C++ 库无法编译,包安装现在会失败。在以前的版本中,如果 C++ 库编译失败,您会得到一个成功的 R 包安装,但它不会做太多有用的事情。
- 您可以通过设置环境变量
LIBARROW_MINIMAL=true来禁用源构建中的所有可选 C++ 组件。这将包含核心 Arrow/Feather 组件,但不包括 Parquet、Datasets、压缩库和其他可选功能。 - 源包现在捆绑了 Arrow C++ 源代码,因此在构建包时无需下载它。由于包含了源代码,因此现在可以在离线/气隙系统中构建该包。默认情况下,离线构建将是最小的,因为它无法下载支持所有功能所需的第三方 C++ 依赖项。为了允许功能齐全的离线构建,包含的
create_package_with_all_dependencies()函数(在不安装 arrow 包的情况下也可在 GitHub 上使用)将下载所有第三方 C++ 依赖项并将它们捆绑在 R 源包中。在连接到网络的系统上运行此函数以生成“fat”源包,然后将该 .tar.gz 包复制到您的离线机器上并安装。特别感谢 @karldw 在此方面付出的巨大努力。 - 源构建可以通过设置环境变量
ARROW_DEPENDENCY_SOURCE=AUTO来利用系统依赖项(如libz)。此版本中这不是默认设置(BUNDLED,即下载并构建所有依赖项),但将来可能会成为默认设置。 - JSON 库组件(
read_json_arrow())现在是可选的,并且仍然默认开启;设置ARROW_JSON=OFF然后再构建以禁用它们。
其他增强和修复
- 更多 Arrow 数据类型在转换为 R 时使用 ALTREP。这在某些工作流程中会显着加速,而在其他工作流程中,它只是延迟了从 Arrow 到 R 的转换。默认情况下使用 ALTREP,但要禁用它,请设置
options(arrow.use_altrep = FALSE) -
Field对象现在可以创建为非可空,并且schema()现在可以选择接受Field列表 - 零除以数字现在与 R 的行为匹配,不再引发错误
-
write_parquet()在与分组 data.frame 一起使用时不再出错 -
如果表达式在 Arrow 中不受支持,
case_when()现在会干净地报错 -
open_dataset()现在可以处理没有标题行的 CSV - 修复了在
read_csv_arrow()中短的 readr 风格类型T和t顺序颠倒的小问题 log(..., base = b)的绑定,其中 b 是除 2、e 或 10 以外的任何值- 对我们的 vignette 进行了一些更新和扩展
- 修复了将长度为 0 的 ChunkedArrays 转换为 R 向量时的段错误
-
Table$create()现在有别名arrow_table()
arrow 5.0.0
CRAN 发布日期:2021-07-29
更多 dplyr
-
现在可以在
dplyr::filter()、mutate()等中对 Arrow 对象使用 250 多个计算函数。此版本中的新增功能包括- 字符串操作:
strsplit()和str_split();strptime();paste()、paste0()和str_c();substr()和str_sub();str_like();str_pad();stri_reverse() - 日期/时间操作:
lubridate方法,如year()、month()、wday()等 - 数学运算:对数(
log()等);三角函数(sin()、cos()等);abs();sign();pmin()和pmax();ceiling()、floor()和trunc() - 条件函数,在此版本中对输入类型有一些限制:对于除
Decimal类型外的所有类型,支持ifelse()和if_else();仅对逻辑、数值和时间类型支持case_when();除列表/结构体外的所有类型都支持coalesce()。另外请注意,在此版本中,因子/字典在这些函数中会转换为字符串。 -
支持
is.*函数,并且可以在relocate()内部使用
- 字符串操作:
arrow_dplyr_query的打印方法现在包括由mutate()派生的列的表达式和结果类型。transmute()现在如果传入参数.keep、.before或.after,会报错,以与dplyr在data.frame上的行为保持一致。
CSV 写入
-
write_csv_arrow()用于使用 Arrow 将 data.frame 写入单个 CSV 文件 -
write_dataset(format = "csv", ...)用于将 Dataset 写入 CSV 文件,包括分区写入
C 接口
- 为 C 数据接口的其余部分添加了绑定:Type、Field 和 RecordBatchReader(来自实验性 C 流接口)。这些还具有
reticulate::py_to_r()和r_to_py()方法。除了添加Scanner$ToRecordBatchReader()方法外,您现在可以在 R 中构建一个 Dataset 查询,并将由此产生的批次流传递给进程中的另一个工具。 - C 接口方法在 Arrow 对象上公开(例如
Array$export_to_c()、RecordBatch$import_from_c()),类似于pyarrow中的方式。这有利于它们在其他包中的使用。有关使用示例,请参阅py_to_r()和r_to_py()方法。
其他增强
- 将 R
data.frame转换为 ArrowTable时使用跨列的多线程处理 - 一些 Arrow 数组类型在转换为 R 时现在使用 ALTREP。要禁用此功能,请设置
options(arrow.use_altrep = FALSE) -
is.na()在浮点数字段中的NaN值上现在评估为TRUE,以与 base R 保持一致。 -
is.nan()在浮点数字段中的NA值上现在评估为FALSE,在非浮点数字段中的所有值上评估为FALSE,以与 base R 保持一致。 Array、ChunkedArray、RecordBatch和Table的附加方法:na.omit()及其类似函数,any()/all()RecordBatch$create()和Table$create()的标量输入现在会被回收-
arrow_info()包含有关 C++ 构建的详细信息,例如编译器版本 -
如果
x不是Scalar、Array或ChunkedArray并且没有分派base::match(),match_arrow()现在会将x转换为Array。 - 行级元数据现在仅限于读取/写入单个 parquet 或 feather 文件。如果 Dataset 包含行级元数据,则读取具有行级元数据的 Dataset 时会忽略行级元数据(并发出警告)。写入包含行级元数据的 Dataset 时也会忽略行级元数据(并发出警告)。我们正在努力实现更强大的实现来支持行级元数据(和其他复杂类型)——敬请期待。对于处理 {sf} 对象,{sfarrow} 有助于序列化 sf 列并与 geopandas 共享它们。
arrow 4.0.0.1
CRAN 发布日期:2021-05-10
- 当在 Linux 上使用包的静态源构建时,mimalloc 内存分配器是默认内存分配器。这是因为它在 valgrind 下的行为比 jemalloc 更好。功能齐全的构建(使用
LIBARROW_MINIMAL=false安装)同时包含 jemalloc 和 mimalloc,并且仍然默认使用 jemalloc,尽管这可以通过ARROW_DEFAULT_MEMORY_POOL环境变量在运行时配置。 - 环境变量
LIBARROW_MINIMAL、LIBARROW_DOWNLOAD和NOT_CRAN在 Linux 构建脚本中现在不区分大小写。 - 解决了 macOS 二进制包中的一个构建配置问题。
arrow 4.0.0
CRAN 发布日期:2021-04-27
dplyr 方法
更多 dplyr 动词受 Arrow 对象支持
-
dplyr::mutate()现在在 Arrow 中受许多应用程序支持。对于Table和RecordBatch上尚未在 Arrow 中支持的查询,实现会首先回退到将数据拉取到内存中的 Rdata.frame中,就像在以前的版本中一样。对于Dataset(可能大于内存)上的查询,如果函数未实现,它会引发错误。目前尚不能在 Arrow 对象上调用的主要mutate()功能是 (1)group_by()之后的mutate()(通常与聚合结合使用)和 (2) 使用dplyr::across()的查询。 -
dplyr::transmute()(调用mutate()) -
dplyr::group_by()现在保留.drop参数并支持 on-the-fly 定义列 -
dplyr::relocate()用于重新排序列 -
dplyr::arrange()用于排序行 -
dplyr::compute()用于评估惰性表达式并返回一个 Arrow Table。这等同于dplyr::collect(as_data_frame = FALSE),它是在 2.0.0 中添加的。
现在可以在 dplyr 动词内部的 Arrow 对象上调用 100 多个函数
- 字符串函数
nchar()、tolower()和toupper(),以及它们的stringr拼写str_length()、str_to_lower()和str_to_upper(),在 Arrowdplyr调用中受支持。也支持str_trim()。 - 正则表达式函数
sub()、gsub()和grepl(),以及str_replace()、str_replace_all()和str_detect(),都受支持。 -
cast(x, type)和dictionary_encode()允许更改 Arrow 对象中列的类型;as.numeric()、as.character()等作为类似的类型更改便利功能暴露出来 -
dplyr::between();Arrow 版本还允许left和right参数是数据中的列,而不仅仅是标量 - 此外,任何 Arrow C++ 计算函数都可以在
dplyr动词内部调用。这使您可以访问没有直接 R 映射的 Arrow 函数。有关所有可用函数,请参阅list_compute_functions(),它们在dplyr中以arrow_为前缀。 - 当在具有不同类型的数据(例如 int32 和 float64)上调用时,Arrow C++ 计算函数现在会进行更系统的类型提升。以前,表达式中的标量总是被强制转换为匹配相应数组的类型,因此这种新的类型提升使得在两个列(数组)上进行操作成为可能,其中一个或两个都是数据集中的列。作为副作用,一些先前版本中可以工作的比较现在不再受支持:例如,
dplyr::filter(arrow_dataset, string_column == 3)将因数字3与string_column的字符串类型之间的类型不匹配而报错。
Datasets
-
open_dataset()现在接受文件路径的向量(甚至单个文件路径)。除其他外,这使得您可以打开单个非常大的文件,并使用write_dataset()将其分区,而无需将整个文件读入内存。 - Datasets 现在可以检测并读取压缩 CSV 文件的目录
-
write_dataset()现在默认为format = "parquet",并更好地验证format参数 - 现在会正确处理在
open_dataset()的schema中输入无效的情况 - 从 Dataset 查询中收集 0 列现在不再返回所有列
Scanner$Scan()方法已被移除;使用Scanner$ScanBatches()
其他改进
-
value_counts()用于汇总Array或ChunkedArray中的值,类似于base::table()。 -
StructArray对象获得了类似 data.frame 的方法,包括names()、$、[[和dim()。 - 现在可以通过使用
$或[[进行赋值(<-)来添加、替换或删除 RecordBatch 列 - 类似地,
Schema现在可以通过在新的类型中赋值来编辑。这使得可以使用 CSV 阅读器检测文件的 schema,修改Schema对象以将任何您希望以不同类型读取的列,然后使用该Schema来读取数据。 - 在用不同长度的列和标量值回收创建具有 schema 的
Table时,进行更好的验证 - 在 Windows 上读取日语或其他多字节区域设置的 Parquet 文件时不再挂起(为 libstdc++ 中的错误提供的解决方法;感谢 @yutannihilation 坚持发现此问题!)
- 如果您尝试读取包含嵌入的 nul (
\0) 字符的字符串数据,错误消息会告知您可以设置options(arrow.skip_nul = TRUE)来剥离它们。不建议默认设置此选项,因为此代码路径速度明显较慢,并且大多数字符串数据不包含 nul 字符。 -
read_json_arrow()现在接受一个 schema:read_json_arrow("file.json", schema = schema(col_a = float64(), col_b = string()))
安装和配置
- R 包现在可以支持使用禁用了附加功能(如数据集、parquet、字符串库)的 Arrow C++ 库;捆绑的构建脚本允许设置环境变量来禁用它们。有关详细信息,请参阅
vignette("install", package = "arrow")。这在有用时允许更快、更小的包构建,并支持在 Solaris 上进行最小的、可工作的 R 包构建。 - 在 macOS 上,现在可以通过设置环境变量
FORCE_BUNDLED_BUILD=true来使用与 Linux 上默认使用的相同的捆绑 C++ 构建及其所有自定义参数。 -
arrow默认使用mimalloc内存分配器(如果可用,例如在 CRAN 二进制包中),而不是jemalloc。jemalloc在 macOS 上存在配置问题,并且基准测试分析显示这对性能有负面影响,尤其是在内存密集型工作流程中。jemalloc仍然是 Linux 上的默认设置;mimalloc是 Windows 上的默认设置。 - 现在,当 Arrow C++ 库被静态链接时(通常是安装自 CRAN 的情况),设置
ARROW_DEFAULT_MEMORY_POOL环境变量来切换内存分配器现在可以正常工作了。 arrow_info()函数现在报告额外的可选功能以及检测到的 SIMD 级别。如果构建中未启用关键功能或压缩库,arrow_info()将引用安装小插曲 (vignette) 以获取有关如何安装更完整构建的指导(如果需要)。- 如果您尝试读取使用您的 Arrow 构建不支持的编解码器压缩的文件,错误消息现在会告诉您如何启用该功能重新安装 Arrow。
- 一个关于开发者环境设置的新小插曲
vignette("developing", package = "arrow")。 - 从源代码构建时,您可以使用环境变量
ARROW_HOME指向 Arrow 库所在的特定目录。这类似于传递INCLUDE_DIR和LIB_DIR。
arrow 3.0.0
CRAN 发布日期:2021-01-27
Python 和 Flight
- Flight 方法
flight_get()和flight_put()(在此版本中重命名自push_data())可以处理 Table 和 RecordBatch。 -
flight_put()获得了overwrite参数,可以选择检查是否存在具有相同名称的资源。 -
list_flights()和flight_path_exists()使您能够查看 Flight 服务器上可用的资源。 -
Schema对象现在具有r_to_py和py_to_r方法。 - 在将 Table 转换为 Python 或从 Python 转换回来时,Schema 元数据会正确保留。
增强功能
- 支持在 Array 和 ChunkedArray 上进行算术运算(
+,*等),并且可以在 Arrowdplyr管道中的过滤表达式中使用。 - 现在可以通过使用
$或[[进行赋值(<-)来添加、替换或删除 Table 的列。 - 可以通过赋值
names()来重命名 Table 和 RecordBatch 的列名。 - 大型字符串类型现在可以写入 Parquet 文件。
rlang的代词.data和.env现在在 Arrowdplyr管道中得到完全支持。- 选项
arrow.skip_nul(默认FALSE,如base::scan()中)允许将包含嵌入的 nul\0字符的 Arrow 字符串(utf8())类型数据转换为 R。如果设置为TRUE,将剥离 nul 字符并在找到时发出警告。 -
arrow_info()用于查看各种运行时和构建时 Arrow 配置的概览,这对于调试很有用。 - 在加载 Arrow 包之前设置环境变量
ARROW_DEFAULT_MEMORY_POOL以更改内存分配器。Windows 包使用mimalloc构建;大多数其他包同时使用jemalloc(默认使用)和mimalloc构建。这些替代内存分配器通常比系统内存分配器快得多,因此在可用时默认使用它们,但有时为了调试目的禁用它们也很有用。要禁用它们,请设置ARROW_DEFAULT_MEMORY_POOL=system。 - 具有元素属性的列表列现在也包含在创建 Arrow 表时保存的元数据中。这允许
sftibble 被忠实地保留和往返(#8549)。 - 超过 100Kb 的 R 元数据在写入表之前会被压缩;有关更多详细信息,请参见
schema()。
错误修复
- 修复了 2.0.0 版本中存在的将 Arrow 字符串类型转换为 R 时的性能回归。
- C++ 函数现在在需要时触发垃圾回收。
-
write_parquet()现在可以写入 RecordBatch。 - 读取包含 0 个批次的 RecordBatchStreamReader 的 Table 不再导致崩溃。
-
将 Arrow RecordBatch 和 table 转换为
readr的problems属性时将其移除,以防止意外积累大量元数据(#9092)。 - 修复了使用 Arrow 0.17 写入的压缩 Feather 文件的读取问题(#9128)。
-
SubTreeFileSystem获得了有用的打印方法,并且在打印时不再报错。
打包和安装
- 可以使用以下命令通过 conda 安装 nightly 开发版本的 conda
r-arrow包:conda install -c arrow-nightlies -c conda-forge --strict-channel-priority r-arrow - Linux 安装现在可以安全地支持较旧的
cmake版本。 - 用于启用 S3 支持的编译器版本检查可以正确识别活动的编译器。
- 更新了
vignette("install", package = "arrow")中的指南和故障排除,特别是针对已知 CentOS 问题。 - Linux 上的操作系统检测使用
distro包。如果您的操作系统未被正确识别,请在此处报告问题。
arrow 2.0.0
CRAN 发布日期:2020-10-20
数据集
-
使用分区将数据集(
write_dataset())写入 Feather 或 Parquet 文件。有关讨论和示例,请参阅vignette("dataset", package = "arrow")的末尾。 - 数据集现在具有
head()、tail()和取用([)方法。head()经过优化,但其他方法可能性能不高。 -
collect()获得了as_data_frame参数,默认为TRUE,但当为FALSE时,它允许您评估累积的select和filter查询,但将结果保留在 Arrow 中,而不是 R 的data.frame中。 -
read_csv_arrow()支持使用Schema和readr包中用于类型的紧凑字符串表示法来指定列类型。它还获得了timestamp_parsers参数,允许您表达一组strptime解析字符串,这些字符串将被尝试用于转换指定为Timestamp类型的列。
AWS S3 支持
- macOS 和 Windows(仅限 Rtools40,即 R >= 4.0)的二进制包中启用了 S3 支持。要在 Linux 上启用它,您需要额外的系统依赖项
libcurl和openssl,以及一个足够现代的编译器。有关详细信息,请参阅vignette("install", package = "arrow")。 - 文件读取器和写入器(
read_parquet()、write_feather()等),以及open_dataset()和write_dataset(),允许您通过提供s3://URI 或提供FileSystem$path()来访问 S3(或模拟 S3 的文件系统)上的资源。有关示例,请参阅vignette("fs", package = "arrow")。 -
copy_files()允许您将文件目录从一个文件系统递归地复制到另一个文件系统,例如从 S3 到本地机器。
Flight RPC
Flight 是一个通用的客户端-服务器框架,用于通过网络接口高性能传输大型数据集。arrow R 包现在提供连接到 Flight RPC 服务器以发送和接收数据的方法。有关概述,请参阅 vignette("flight", package = "arrow")。
计算
- Arrow Array 和 ChunkedArray 上的比较(
==、>等)和布尔运算(&、|、!),以及is.na、%in%和match(调用match_arrow()),现在都在 C++ 库中实现。 - 为 Array 和 ChunkedArray 实现了聚合方法
min()、max()和unique()。 -
现在在 C++ 库中而不是通过将数据拉取到 R 中进行评估来评估 Arrow Table 和 RecordBatch 上的
dplyr过滤表达式。这带来了显著的性能提升。 -
现在支持 Table/RecordBatch 的 dplyr 查询的
dim()(nrow)。
打包和安装
-
arrow现在依赖于cpp11,这带来了更可靠的 UTF-8 处理和更快的编译。 - Linux 构建脚本在新版本的 R 上成功运行。
- macOS 二进制包现在附带启用了 zstandard 压缩。
错误修复和其他增强功能
- 当所有值都适合 R 32 位整数时,Arrow
Int64类型的自动转换现在会正确检查 ChunkedArray 中的所有块,并且可以通过设置options(arrow.int64_downcast = FALSE)来禁用此转换(以便Int64始终产生一个bit64::integer64向量)。 - 除了 1.0.0 中添加的在往返过程中保留的 data.frame 列元数据外,data.frame 本身的属性现在也保留在 Arrow schema 元数据中。
- 文件写入器现在尊重系统 umask 设置。
-
ParquetFileReader具有用于从文件中访问单个列或行组的附加方法。 - 修复了各种分段错误:
ParquetFileWriter中的无效输入;从保存的 R 对象返回的无效ArrowObject指针;将深层嵌套的结构体从 Arrow 转换为 R 时出现的问题。 write_parquet()的properties和arrow_properties参数已被弃用。
arrow 1.0.0
CRAN 发布日期:2020-07-25
Arrow 格式转换
-
vignette("arrow", package = "arrow")包含解释 R 类型如何转换为 Arrow 类型以及反之的表格。 - 添加了对转换为/来自更多 Arrow 类型的支持:
uint64、binary、fixed_size_binary、large_binary、large_utf8、large_list、structs的list。 -
超过 2GB 的
character向量转换为 Arrowlarge_utf8类型。 -
POSIXlt对象现在可以转换为 Arrow (struct)。 - R
attributes()在转换为 Arrow RecordBatch 和 table 时保留在 Arrow 元数据中,并在从 Arrow 转换回来时恢复。这意味着自定义子类,例如haven::labelled,在通过 Arrow 往返时会被保留。 - Schema 元数据现在作为命名列表暴露,并且可以通过赋值像
batch$metadata$new_key <- "new value"这样修改。 - Arrow 类型
int64、uint32和uint64现在如果所有值都在范围内,则转换为 Rinteger。 - Arrow
date32现在转换为 RDate,具有double底层存储。尽管数据值本身是整数,但这提供了更严格的往返保真度。 - 在转换为 R
factor时,具有不相同字典的dictionaryChunkedArray 会被正确统一。 - 在 1.0 版本中,Arrow IPC 元数据版本从 V4 增加到 V5。默认情况下,
RecordBatch{File,Stream}Writer将写入 V5,但您可以指定备用的metadata_version。为方便起见,如果您知道使用者无法读取 V5,可以设置环境变量ARROW_PRE_1_0_METADATA_VERSION=1以写入 V4,而无需更改任何其他代码。
数据集
- 现在支持 CSV 和其他文本分隔的数据集。
- 使用自定义 C++ 构建时,可以通过传递
ds <- open_dataset("s3://...")这样的 URL 直接在 S3 上读取数据集。请注意,这目前需要一个特殊的 C++ 库构建并带有额外的依赖项——这在 CRAN 版本或 nightly 包中尚不可用。 - 在读取单个 CSV 和 JSON 文件时,压缩会根据文件扩展名自动检测。
其他增强功能
- 对 C++ 聚合方法的初始支持:
sum()和mean()在Array和ChunkedArray上实现。 - Table 和 RecordBatch 具有更多类似 data.frame 的方法,包括
dimnames()和as.list()。 - Table 和 ChunkedArray 现在可以通过
reticulate移动到/来自 Python。
错误修复和弃用
- 当传递给 Arrow 内存并适当重新本地化为 R 时,非 UTF-8 字符串(Windows 上常见)会被正确强制转换为 UTF-8。
write_parquet()的coerce_timestamps选项现在已正确实现。- 创建 Dictionary 数组会尊重用户提供的
type定义。 -
read_arrow和write_arrow现已弃用;请根据您处理的是 Arrow IPC 文件格式还是流格式,使用read/write_feather()和read/write_ipc_stream()函数。 - 先前弃用的
FileStats、read_record_batch和read_table已被移除。
arrow 0.17.1
CRAN 发布日期:2020-05-19
- 与
dplyr1.0 的兼容性更新。 -
reticulate::r_to_py()转换现在可以自动正确工作,无需您自己调用该方法。 - C++ 库中围绕 Parquet 读取的各种错误修复。
arrow 0.17.0
CRAN 发布日期:2020-04-21
Feather v2
此版本包括对 Feather 文件格式第 2 版的支持。Feather v2 具有对所有 Arrow 数据类型的完全支持,解决了大型字符串数据每列 2GB 的限制,并且允许使用 lz4 或 zstd 压缩文件。write_feather() 可以写入第 2 版或 第 1 版 Feather 文件,而 read_feather() 会自动检测它正在读取哪个文件版本。
与此更改相关,围绕读写数据的几个函数已被重新设计。添加了 read_ipc_stream() 和 write_ipc_stream(),以促进将数据写入 Arrow IPC 流格式,这与 IPC 文件格式略有不同(Feather v2 *就是* IPC 文件格式)。
行为已标准化:所有 read_<format>() 返回 R data.frame(默认)或在参数 as_data_frame = FALSE 时返回 Table;所有 write_<format>() 函数返回数据对象,但不显示返回值。为了方便某些工作流程,添加了一个特殊的 write_to_raw() 函数来包装 write_ipc_stream() 并返回包含写入的缓冲区的 raw 向量。
为了实现这种标准化,read_table()、read_record_batch()、read_arrow() 和 write_arrow() 已被弃用。
Python 互操作性
Apache Arrow 0.17 版本包括一个 C 数据接口,允许在 C 级别进程内交换 Arrow 数据,无需复制,也无需库之间存在构建或运行时依赖关系。这使得我们能够使用 reticulate 在 R 和 Python (pyarrow) 之间高效地共享数据。
有关详细信息,请参阅 vignette("python", package = "arrow")。
数据集
- 数据集读取得益于 C++ 库中的许多加速和修复。
- 数据集具有
dim()方法,该方法对所有文件中的行进行求和(#6635,@boshek)。 - 使用
c()方法将多个数据集合并为一个可查询的UnionDataset。 - 数据集过滤现在将
NA视为FALSE,与dplyr::filter()一致。 - 现在正确支持所有 Arrow 日期/时间/时间戳列类型的数据集过滤。
-
vignette("dataset", package = "arrow")现在具有正确、可执行的代码。
安装
- Linux 上的安装现在默认从源代码构建 C++ 库,禁用了一些压缩库。为了获得更快、更丰富的构建,请设置环境变量
NOT_CRAN=true。有关详细信息和更多选项,请参阅vignette("install", package = "arrow")。 - 源代码安装在更多 Linux 发行版上更快、更可靠。
其他错误修复和增强功能
-
unify_schemas()用于创建包含多个 schema 字段并集的Schema。 - 时区在 R 和 Arrow 之间的往返过程中被忠实地保留。
-
read_feather()和其他读取器函数会关闭它们打开的任何文件连接。 - 当
R.oo包也加载时,Arrow R6 对象不再发生命名空间冲突。 -
FileStats被重命名为FileInfo,并且原始拼写已被弃用。
arrow 0.16.0.2
CRAN 发布日期:2020-02-14
-
install_arrow()现在安装最新版本的arrow,包括 Linux 依赖项,无论是用于 CRAN 发布还是用于开发构建(如果nightly = TRUE)。 - 除非设置了
LIBARROW_DOWNLOAD或NOT_CRAN环境变量,否则 Linux 上的包安装不再下载 C++ 依赖项。 -
write_feather()、write_arrow()和write_parquet()现在返回它们的输入,类似于readr包中的write_*函数(#6387,@boshek)。 - 现在可以推断 R
list的类型,并在所有列表元素类型相同时创建 ListArray(#6275,@michaelchirico)。
arrow 0.16.0
CRAN 发布日期:2020-02-09
多文件数据集
此版本包含 Arrow Datasets 的 dplyr 接口,它允许您高效地将大型多文件数据集作为一个实体来处理。使用 open_dataset() 浏览数据文件目录,然后使用 dplyr 方法来 select()、filter() 等。尽可能在 Arrow 内存中进行工作。在必要时,数据会被拉取到 R 中进行进一步计算。如果可用,dplyr 方法会被条件加载;它不是一个硬性依赖项。
有关详细信息,请参阅 vignette("dataset", package = "arrow")。
Linux 安装
源代码包安装(如从 CRAN)现在会自动处理其 C++ 依赖项。对于常见的 Linux 发行版和版本,安装将检索预构建的静态 C++ 库以包含在包中;在没有该二进制文件的情况下,包会执行一个捆绑的脚本,该脚本应在除 R 所需之外没有系统依赖项的情况下构建 Arrow C++ 库。
有关详细信息,请参阅 vignette("install", package = "arrow")。
数据探索
-
Table和RecordBatch也具有dplyr方法。 - 对于不使用
dplyr的探索,Table、RecordBatch、Array 和 ChunkedArray 的[方法现在支持自然的行提取操作。这些操作使用 C++ 的Filter、Slice和Take方法来进行高效访问,具体取决于选择向量的类型。 - 还添加了一个实验性的、惰性求值的
array_expression类,它使得能够在不首先将所有内容拉取到 R 中的情况下,通过数组的某些函数来过滤 Table,例如arrow_table[arrow_table$var1 > 5, ]。
压缩
-
write_parquet()现在支持压缩。 -
codec_is_available()返回TRUE或FALSE,表示 Arrow C++ 库在构建时是否支持给定的压缩库(例如 gzip、lz4、snappy)。 - Windows 构建现在包含对 zstd 和 lz4 压缩的支持(#5814,@gnguy)。
其他修复和改进
- 现在支持 Arrow null 类型。
- Factor 类型在通过 Parquet 格式的往返过程中得到保留(#6135,@yutannihilation)。
- 读取 Arrow dictionary 类型会将 dictionary 值强制转换为
character(因为 Rfactor的水平值必须是字符型)而不是引发错误。 - Parquet 函数文档的许多改进(@karldw,@khughitt)。
arrow 0.15.0
CRAN 发布日期:2019-10-07
破坏性变更
- 包装 C++ 类的 R6 类现在已记录和导出,并且已重命名以更友好于 R。使用本包中高级 R 接口的用户不受影响。那些希望更直接地与 Arrow C++ API 交互的用户应使用这些对象和方法。作为此更改的一部分,许多实例化这些 R6 对象的函数已被移除,取而代之的是
Class$create()方法。特别是,arrow::array()和arrow::table()已被移除,取而代之的是Array$create()和Table$create(),从而消除了包启动时关于屏蔽base函数的消息。有关更多信息,请参阅新的vignette("arrow")。 - 由于 Arrow 消息格式的细微变化,由 0.15 版本库写入的数据可能无法被旧版本读取。如果您需要将数据发送到使用旧版本 Arrow 的进程(例如尚未更新到 Arrow 0.15 的 Apache Spark 服务器),您可以设置环境变量
ARROW_PRE_0_15_IPC_FORMAT=1。 read_*()函数中的as_tibble参数已重命名为as_data_frame(#5399,@jameslamb)。arrow::Column类已被移除,因为它已从 C++ 库中移除。
新功能
-
Table和RecordBatch对象现在具有 S3 方法,使您能更像处理data.frame一样处理它们。例如提取列、子集等。请参阅?Table和?RecordBatch查看示例。 - C++ 文件系统 API 绑定的初始实现。(#5223)
- Windows 上现在支持压缩流(#5329),并且您还可以指定压缩级别(#5450)
其他升级
- 由于 Arrow C++ 库的改进,Parquet 文件读取速度大大加快。
-
read_csv_arrow()支持更多解析选项,包括col_names、na、quoted_na和skip -
read_parquet()和read_feather()可以从raw向量中摄取数据(#5141) - 文件读取器现在能正确处理需要展开的路径,例如
~/file.parquet(#5169) - 改进了在 schema 中创建类型的支持:类型打印名称(例如“double”)现在保证可用于实例化 schema(例如
double()),并且可以使用人性化的分辨率字符串(“ms”、“s”等)创建时间类型。(#5198, #5201)