本文介绍了 arrow 提供的各种数据和元数据对象类型,并记录了这些对象的结构。
Arrow 元数据类
arrow 包定义了以下用于表示元数据的类
- 一个
Schema
是一个Field
对象列表,用于描述表格数据对象的结构;其中 - 一个
Field
指定一个字符字符串名称和一个DataType
;以及 - 一个
DataType
是一个控制值如何表示的属性
考虑一下
df <- data.frame(x = 1:3, y = c("a", "b", "c"))
tb <- arrow_table(df)
tb$schema
## Schema
## x: int32
## y: string
##
## See $metadata for additional Schema metadata
自动推断的模式也可以手动创建
## Schema
## x: int32
## y: string
schema()
函数允许使用以下简写方式来定义字段
## Schema
## x: int32
## y: string
有时需要手动指定模式,尤其是在需要对 Arrow 数据类型进行细粒度控制时
arrow_table(df, schema = schema(x = int64(), y = utf8()))
## Table
## 3 rows x 2 columns
## $x <int64>
## $y <string>
##
## See $metadata for additional Schema metadata
arrow_table(df, schema = schema(x = float64(), y = utf8()))
## Table
## 3 rows x 2 columns
## $x <double>
## $y <string>
##
## See $metadata for additional Schema metadata
R 对象属性
Arrow 支持附加到模式的自定义键值元数据。当我们将 data.frame
转换为 Arrow 表格或 RecordBatch 时,该包会将附加到 data.frame
列的任何 attributes()
存储在 Arrow 对象模式中。以这种方式添加到对象的属性存储在 r
键下,如下所示
# data frame with custom metadata
df <- data.frame(x = 1:3, y = c("a", "b", "c"))
attr(df, "df_meta") <- "custom data frame metadata"
attr(df$y, "col_meta") <- "custom column metadata"
# when converted to a Table, the metadata is preserved
tb <- arrow_table(df)
tb$metadata
## $r
## $r$attributes
## $r$attributes$df_meta
## [1] "custom data frame metadata"
##
##
## $r$columns
## $r$columns$x
## NULL
##
## $r$columns$y
## $r$columns$y$attributes
## $r$columns$y$attributes$col_meta
## [1] "custom column metadata"
##
##
## $r$columns$y$columns
## NULL
也可以使用以下命令在您希望的任何其他键下分配其他字符串元数据
tb$metadata$new_key <- "new value"
将元数据附加到模式后,在将表格写入 Arrow/Feather 或 Parquet 格式时会保留该元数据。当将这些文件读入 R 或在表格或 RecordBatch 上调用 as.data.frame()
时,列属性将恢复到结果 data.frame
的列。这意味着自定义数据类型(包括 haven::labelled
、vctrs
注释等)在通过 Arrow 进行往返操作时会保留。
请注意,存储在 $metadata$r
中的属性仅被 R 理解。如果您将带有 haven
列的 data.frame
写入 Feather 文件并在 Pandas 中读取该文件,则 haven
元数据在那里将不会被识别。类似地,Pandas 会写入自己的自定义元数据,而 R 包不会使用这些元数据。但是,您可以自由地为您的应用程序定义自定义元数据约定,并将您想要的任何(字符串)值分配给其他元数据键。