使用 Python 打开保存为 Parquet 文件中元数据的 R data.table

问题描述 投票:0回答:1

使用 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
表作为数据帧检索?

python r parquet pyarrow apache-arrow
1个回答
0
投票

参见 https://arrow.apache.org/docs/r/articles/metadata.html

请注意,存储在 $metadata$r 中的属性只能被 R 理解。如果将带有避难所列的 data.frame 写入 Feather 文件并在 Pandas 中读取,避难所元数据将不会被识别。同样,Pandas 编写自己的自定义元数据,R 包不会使用这些元数据。但是,您可以自由地为您的应用程序定义自定义元数据约定,并将所需的任何(字符串)值分配给其他元数据键。

所以你正在寻找的东西是不可能的。但由于其他原因,也不建议将实际数据(如您想要的那样)保存在元数据中,从而失去了箭头数据/镶木地板的柱状格式给您带来的所有好处。在这个小例子中你不会注意到这一点,但我猜你想使用超过 3 个值:D

我不清楚你的目标是什么,为什么不直接

cbind
data.tables 并将它们保存在一个文件中?

© www.soinside.com 2019 - 2024. All rights reserved.