首页 > 编程问答 >使用 Python 打开保存为 Parquet 文件中元数据的 R data.table

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

时间:2024-07-27 06:01:24浏览次数:9  
标签:python r parquet pyarrow apache-arrow

使用 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

相关文章

  • 为什么警告:FutureWarning:设置不兼容的数据类型的项目已被弃用,并且会在 pandas 的未来
    鉴于这种情况,我不明白为什么要提出这个特殊警告。将函数应用于数字系列时,它会引发“FutureWarning:设置不兼容dtype的项目已被弃用,并将在pandas的未来版本中引发错误。值'[011...100]'具有dtype与int32不兼容,请先显式转换为兼容的数据类型。"这是正在应用的......
  • Python 需要 Windows 长路径
    我尝试运行此安装:pip3installmsgraph-sdk它给了我这个错误:它说我需要使用此链接启用Windows长路径:https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-versi......
  • 如何在 Litestar GET 路由中使用 Pydantic 模型作为查询参数
    我正在尝试使用Litestar创建一条GET路由,该路由利用Pydantic模型作为查询参数。但是,序列化无法按预期工作。这是重现我的问题的最小示例:frompydanticimportBaseModelfromlitestarimportLitestar,get,ControllerclassInput(BaseModel):foo:str......
  • 使用 R 生成寿命图
    我有一个记录单个细胞的寿命和生成时间的数据集,我想将其绘制如下:Example_RLS_plot参考:https://doi.org/10.1186/s12951-022-01379-9这是我的示例数据集:|Cell|Generation|Doubling_time||--------|----------|--------------||1......
  • isinstance() arg 2 必须是类型、类型元组或联合
    我在尝试训练模型时收到一条错误消息,但出于某种原因,每次更改模型时它都会给我相同的消息。以下是代码:#Definetrainingargumentstraining_args=TrainArgument(output_dir="bert_results",num_train_epochs=3,per_device_train_batch_size=8,per_......
  • 使用 Selenium 时的 WebDriver 错误错误:OSError: [WinError 193] %1 不是有效的 Win32
    我正在使用文档中的代码:https://pypi.org/project/webdriver-manager/#use-with-chrome安装并升级所有软件包并运行下面的代码后:fromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServiceasChromeServicefromwebdriver_manager.......
  • Python griddata() 和 Matlab griddata():某些网格点的结果不同
    在将一些(相当大的物理)Matlab代码转换为Python时,我偶然发现了这种情况。当对相同的二维离散数据进行插值时,Python/Scipy的griddata()函数给出的结果与Matlab的对应函数不同。griddata()Matlab示例代码:Python示例代码:%Samplepoints(x,y):7x5=3......
  • 为什么存在 re._compile?
    这是re.compile:>>>importre,inspect>>>print(inspect.getsource(re.compile))defcompile(pattern,flags=0):"Compilearegularexpressionpattern,returningaPatternobject."return_compile(pattern,......
  • Ebay Python SDK 仅在特定项目类别上返回错误
    我在一个项目中使用ebaySDK一段时间了。最近我尝试导入一些商品,例如手表、手机壳等...并且我使用了eBay自己通过eBay返回的英国商店页面上的类别ID他们的“get_category_suggestions”API端点,但eBay似乎有选择地决定拒绝某些项目并引发服务器错误!为了测试,我做了......
  • 使用特定的Python版本(MacOS)制作virtualenv
    我安装了brew,python3(默认和最新版本)和pip3,pyenv。TensorFlow现在不支持python3.7,所以我听说我应该制作一个独立运行3.6或更低版本的virtualenv。我安装了python3.6.7bypyenvinstall3.6.7但无法制作virtualenv-p3.6.7(mydir)因为3.6.7不在P......