使用 R,我创建了一个 Parquet 文件,其中包含一个data.table
作为主数据,以及另一个data.table
作为元数据。
library(data.table)
library(arrow)
dt = data.table(x = c(1, 2, 3), y = c("a", "b", "c"))
dt2 = data.table(a = 22222, b = 45555)
attr(dt, "dt_meta") = dt2
tb = arrow_table(dt)
tb$metadata
write_parquet(tb, "file.parquet")
在 R 中加载 Parquet 文件时可以轻松访问属性/元数据:
dt = open_dataset("file.parquet")
dt$metadata$r$attributes$dt_meta
dt2 = read_parquet("file.parquet")
attributes(dt2)$dt_meta
现在我想知道是否也可以从 Python 中的 Parquet 文件的元数据中检索 data.table(或 data.frame)。
可以使用 pyarrow 库在 Python 中访问元数据,并且 r 字段存在,但未正确解码。
import pyarrow.parquet as pq
mt = pq.read_metadata("file.parquet")
metadata = mt.metadata[b'r']
metadata
结果:
b'A\n3\n263169\n197888\n5\nUTF-8\n531\n2\n531\n3\n16\n2\n262153\n10\ndata.table\n262153\n10\ndata.frame\n22\n22\n254\n254\n16\n2\n262153\n1\nx\n262153\n1\ny\n787\n2\n14\n1\n22222\n14\n1\n45555\n1026\n1\n262153\n5\nnames\n16\n2\n262153\n1\na\n262153\n1\nb\n1026\n1\n262153\n9\nrow.names\n13\n2\nNA\n-1\n1026\n1\n262153\n5\nclass\n16\n2\n262153\n10\ndata.table\n262153\n10\ndata.frame\n1026\n1\n262153\n17\n.internal.selfref\n22\n22\n254\n254\n16\n2\n262153\n1\na\n262153\n1\nb\n254\n1026\n1023\n16\n3\n262153\n5\nclass\n262153\n17\n.internal.selfref\n262153\n7\ndt_meta\n254\n531\n2\n254\n254\n1026\n1023\n16\n2\n262153\n1\nx\n262153\n1\ny\n254\n1026\n1023\n16\n2\n262153\n10\nattributes\n262153\n7\ncolumns\n254\n'
它仍然是一个 R 属性对象,还是另一个编码对象?
可以从这个结果字符串中读取不同属性的名称(例如dt_meta
),但是否可以完全解码和解析它以将dt_meta
表作为 DataFrame 检索?
请参阅https://arrow.apache.org/docs/r/articles/metadata.html
因此,您所寻找的是不可能的。但出于其他原因,也不建议这样做,因为将实际数据(如您所愿)保存在元数据中会失去箭头数据/镶木地板的列格式给您带来的所有好处。您不会在这个小例子中注意到这一点,但我猜您想使用超过 3 个值:D
我不清楚您的目标是什么,为什么不只使用
cbind
数据表并将它们保存在一个文件中?