一个 Schema 是一个 Arrow 对象,包含 Field,它们将名称映射到 Arrow 数据类型。当您希望将 R data.frame 转换为 Arrow 但不希望依赖 R 类型到 Arrow 类型的默认映射时,例如当您希望选择特定的数字精度时,或者在创建 Dataset 并希望确保特定模式而不是从各种文件中推断模式时,可以创建一个 Schema。
许多 Arrow 对象,包括 Table 和 Dataset,都有一个 $schema 方法(活动绑定),可让您访问它们的模式。
方法
$ToString():转换为字符串$field(i):返回索引i处的字段(从 0 开始)$GetFieldByName(x):返回名称为x的字段$WithMetadata(metadata):返回一个设置了键值metadata的新Schema。请注意,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 Table 或 RecordBatch 时,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 中。
由于 Schema 元数据键和值必须是字符串,因此此元数据通过将 R 的属性列表结构序列化为字符串来保存。如果序列化的元数据大小超过 100KB,则从版本 3.0.0 开始,默认情况下会对其进行压缩。要禁用此压缩(例如,对于与 3.0.0 之前的 Arrow 版本兼容并包含大量元数据的表),请将选项 arrow.compress_metadata 设置为 FALSE。包含压缩元数据的文件可由旧版本的 Arrow 读取,但元数据会被丢弃。