本文介绍了 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 也可以手动创建:
## Schema
## x: int32
## y: string
schema() 函数允许使用以下速记法来定义字段:
## Schema
## x: int32
## y: string
有时手动指定 schema 非常重要,特别是当您希望对 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 支持附加到 Schema 的自定义键值元数据。当我们转换 data.frame 为 Arrow Table 或 RecordBatch 时,该软件包会将附加到 data.frame 列上的任何 attributes() 存储在 Arrow 对象的 Schema 中。以这种方式添加到对象的属性存储在 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"当将 Table 写入 Arrow/Feather 或 Parquet 格式时,附加到 Schema 的元数据会被保留。将这些文件读入 R,或者对 Table 或 RecordBatch 调用 as.data.frame() 时,列属性会还原到生成的 data.frame 列中。这意味着自定义数据类型(包括 haven::labelled、vctrs 注释等)在经过 Arrow 往返处理时会被保留。
请注意,存储在 $metadata$r 中的属性仅能被 R 理解。如果您将带有 haven 列的 data.frame 写入 Feather 文件并在 Pandas 中读取,haven 元数据将无法被识别。同样,Pandas 会写入其自己的自定义元数据,R 软件包也不会使用这些元数据。不过,您可以自由地为您的应用程序定义自定义元数据约定,并将任何(字符串)值分配给其他元数据键。