使用 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 检索?
不幸的是,你不能直接使用
pyarrow
解码 R 属性对象并提取
dt_meta
数据帧。
b'...'
中显示的字节字符串是压缩的 R 对象,
pyarrow
不提供解析它的工具。
你需要做的是在 R 中修改你的代码,在将数据写入 Parquet 文件时,将元数据作为单独的列组或文件保存。以下是两种方法:
方法 1:将元数据保存为列组
你可以将元数据
data.table
作为单独的列组包含在同一个 Parquet 文件中。
R 代码:
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)
# 创建一个包含数据和元数据的列表
data <- list(data = dt, metadata = dt2)
# 将列表写入 Parquet 文件,每个元素作为一组列
write_parquet(data, "file.parquet", use_deprecated_int96_timestamps = FALSE)
Python 代码:
import pyarrow.parquet as pq
# 读取 Parquet 文件
table = pq.read_table("file.parquet")
# 访问数据和元数据
data_df = table.column("data").to_pandas()
metadata_df = table.column("metadata").to_pandas()
print(data_df)
print(metadata_df)
方法 2:将元数据保存为单独的文件
你可以将元数据
data.table
写入一个单独的 Parquet 文件。
R 代码:
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)
write_parquet(dt, "file_data.parquet")
write_parquet(dt2, "file_metadata.parquet")
Python 代码:
import pyarrow.parquet as pq
# 读取数据和元数据文件
data_df = pq.read_table("file_data.parquet").to_pandas()
metadata_df = pq.read_table("file_metadata.parquet").to_pandas()
print(data_df)
print(metadata_df)
这些方法可以让你在 Python 中轻松地访问和使用元数据。 选择最适合你的用例的方法。
标签:python,r,parquet,pyarrow,apache-arrow From: 78799730