跳至内容

Schema 是一个 Arrow 对象,包含 字段,将名称映射到 Arrow 数据类型。当您想要将 R data.frame 转换为 Arrow 但不想依赖于 R 类型到 Arrow 类型的默认映射时,创建 Schema,例如,当您想要选择特定的数值精度,或当创建 数据集 时,您希望确保特定的架构,而不是从各种文件推断。

许多 Arrow 对象,包括 数据集,具有 $schema 方法(活动绑定),允许您访问它们的架构。

方法

  • $ToString(): 转换为字符串

  • $field(i): 返回索引为 i(从 0 开始)的字段

  • $GetFieldByName(x): 返回名称为 x 的字段

  • $WithMetadata(metadata): 返回一个新的 Schema,其中设置了键值 metadata。请注意,metadata 中的所有列表元素都将强制转换为 character

  • $code(namespace): 返回用于生成此架构的 R 代码。使用 namespace=TRUE 并在 arrow:: 中调用。

活动绑定

  • $names: 返回字段名称(在 names(Schema) 中调用)

  • $num_fields: 返回字段数量(在 length(Schema) 中调用)

  • $fields: 返回 Schema 中的 Field 列表,适用于迭代

  • $HasMetadata: 逻辑值:此 Schema 是否具有额外的元数据?

  • $metadata: 将键值元数据作为命名列表返回。通过赋值修改或替换(sch$metadata <- new_metadata)。所有列表元素都强制转换为字符串。

R 元数据

将 data.frame 转换为 Arrow 表或记录批次时,data.frame 的属性将与表一起保存,以便可以忠实地将对象重新构建为 R(例如,使用 as.data.frame())。此元数据既可以在 data.frame 的顶层(例如,attributes(df)),也可以在列(例如,attributes(df$col_a))或仅对于列表列:元素级别(例如,attributes(df[1, "col_a"]))。例如,这允许将 haven 列存储在表中,并且能够在拉回 R 时忠实地重新创建它们。此元数据与架构(列名和类型)分开,该架构与其他 Arrow 客户端兼容。R 元数据仅由 R 读取,而其他客户端忽略(例如,Pandas 有自己的自定义元数据)。此元数据存储在 $metadata$r 中。

由于架构元数据键和值必须是字符串,因此此元数据通过将 R 的属性列表结构序列化为字符串来保存。如果序列化的元数据大小超过 100Kb,则默认情况下,它将从版本 3.0.0 开始压缩。要禁用此压缩(例如,对于与 3.0.0 之前的 Arrow 版本兼容的表,并且包含大量元数据),请将选项 arrow.compress_metadata 设置为 FALSE。包含压缩元数据的文件可由旧版本的 arrow 读取,但元数据将被删除。