R:从 parquet 文件中读取前 n 行?

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

我意识到 parquet 是一种列格式,但对于大文件,有时您不想在过滤之前将其全部读取到 R 中的内存中,前 1000 行左右可能足以用于测试。我在阅读镶木地板文档此处中没有看到选项。

我看到了 pandas 的解决方案here,以及 c# 的选项here,这两个选项对我来说并不明显,它们如何转换为 R。建议?

r parquet
3个回答
4
投票

感谢乔恩和丹指出了正确的方向。

arrow::open_dataset()
允许延迟评估(文档这里),然后您可以从中获取
head()
(但不是
slice()
)或
filter()
。这个过程更快,并且使用更少的峰值内存。下面的例子。

# https://stackoverflow.com/questions/73131505/r-reading-first-n-rows-from-parquet-file

library(dplyr)
library(arrow)
library(tictoc) # optional, used to time results

tic("read all of large parquet file")
my_animals <- read_parquet("data/my_animals.parquet")
toc() # slow and uses heaps of ram

tic("read parquet and write mini version")
my_animals <- open_dataset("data/my_animals.parquet") 
my_animals # this is a lazy object

my_animals %>% 
  #slice(1000L) %>% # doesn't work
  head(n=1000L) %>% 
  # filter(YEAROFBIRTH >= 2010) %>% # also works
  compute() %>% 
  write_parquet("data/my_animals_mini.parquet") # optional
toc() # much faster, much less peak ram used

1
投票

您可以使用

as_data_frame
read_parquet
参数将数据作为“箭头表”对象返回。然后,您可以在此对象上使用
{dplyr}
函数,然后使用
dplyr::collect
collect
将返回 tibble 对象,而
compute
仅强制计算)。

library(dplyr)
library(arrow)

my_animals <- read_parquet("data/my_animals.parquet", as_data_frame = FALSE) |>
  slice_head(n = 1000) |>
  collect()

这是可读的、快速的并且内存效率高!

请参阅 https://arrow.apache.org/docs/r/articles/data_wrangling.html 了解更多信息。


0
投票

我发布了这个简单的包以供实际使用。 https://github.com/mkparkin/Rinvent 请随时检查这是否有帮助。 有一个名为“sample”的参数,它带来样本行。它还可以读取“delta”文件

readparquetR(pathtoread="C:/users/...", 格式=“增量”,样本=10) 或者 readparquetR(pathtoread="C:/users/...", 格式=“镶木地板”,样本=10)

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