Com R, criei um arquivo Parquet contendo um data.table
como dados principais e outro data.table
como metadados.
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")
Atributos/metadados podem ser acessados facilmente ao carregar o arquivo Parquet em R:
dt = open_dataset("file.parquet")
dt$metadata$r$attributes$dt_meta
dt2 = read_parquet("file.parquet")
attributes(dt2)$dt_meta
Agora me pergunto se também é possível recuperar o data.table (ou data.frame) dos metadados do arquivo Parquet em Python.
Os metadados podem ser acessados em Python com a biblioteca pyarrow, e o campo r está lá, mas não foi decodificado corretamente.
import pyarrow.parquet as pq
mt = pq.read_metadata("file.parquet")
metadata = mt.metadata[b'r']
metadata
Resultado:
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'
Ainda é um objeto de atributo R ou outro objeto codificado?
Os nomes dos diferentes atributos (por exemplo dt_meta
) podem ser lidos nesta string resultante, mas é possível decodificá-la e analisá-la completamente para recuperar a dt_meta
tabela como um DataFrame?
Consulte https://arrow.apache.org/docs/r/articles/metadata.html
Então o que você procura não é possível. Mas também não é aconselhável por outros motivos, pois salvar dados reais (como você deseja) nos metadados perde todos os benefícios que o formato colunar de dados de seta/parquet oferece. Você não notará isso com este pequeno exemplo, mas suponho que você queira trabalhar com mais de 3 valores:D
Não estou claro o que você pretende alcançar, por que não apenas
cbind
os data.tables e salvá-los em um arquivo?