繁体   English   中英

使用箭头 package 读取镶木地板文件时出现问题

[英]Problem when reading a parquet file with the arrow package

我刚刚开始使用箭头 package 读取/写入镶木地板文件。 我有一个 28 M x 35 的文件,我可以使用 write_parquet(data, 'file.parquet') 将此文件写入磁盘 - 大约 2.5 Gb。

但是当我尝试使用 write_arrow('file.parquet') 读取它时,我收到以下错误:

Error: IOError: Couldn't deserialize thrift: TProtocolException: Exceeded size limit

我使用的是具有 64 Gb RAM 的英特尔 Mac,所以我认为这不是 memory 问题。

实际上,我刚刚找到了一种解决方法:它是 data.table,如果我这样做:

vars = names(data)
write_parquet(data[,..vars], 'file.parquet')

我可以读取生成的镶木地板文件。 有没有人知道发生了什么?

非常感谢

会话信息():

R version 4.1.2 (2021-11-01)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Monterey 12.0.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] qs_0.25.1.1       data.table_1.14.3 arrow_6.0.1      

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.7          mvtnorm_1.1-3       lattice_0.20-45     png_0.1-7           zoo_1.8-9          
 [6] assertthat_0.2.1    digest_0.6.28       utf8_1.2.2          R6_2.5.1            plyr_1.8.6         
[11] backports_1.4.0     stats4_4.1.2        ggplot2_3.3.5       pillar_1.6.4        rlang_0.4.12       
[16] multcomp_1.4-17     rstudioapi_0.13     rpart_4.1-15        Matrix_1.3-4        checkmate_2.0.0    
[21] splines_4.1.2       stringr_1.4.0       foreign_0.8-81      htmlwidgets_1.5.4   bit_4.0.4          
[26] munsell_0.5.0       compiler_4.1.2      xfun_0.28           pkgconfig_2.0.3     base64enc_0.1-3    
[31] libcoin_1.0-9       htmltools_0.5.2     nnet_7.3-16         tidyselect_1.1.1    tibble_3.1.6       
[36] gridExtra_2.3       htmlTable_2.3.0     coin_1.4-2          Hmisc_4.6-0         codetools_0.2-18   
[41] matrixStats_0.61.0  fansi_0.5.0         crayon_1.4.2        dplyr_1.0.7         MASS_7.3-54        
[46] grid_4.1.2          gtable_0.3.0        lifecycle_1.0.1     DBI_1.1.1           magrittr_2.0.1     
[51] scales_1.1.1        RcppParallel_5.1.4  stringi_1.7.5       latticeExtra_0.6-29 ellipsis_0.3.2     
[56] generics_0.1.1      vctrs_0.3.8         stringfish_0.15.4   sandwich_3.0-1      RApiSerialize_0.1.0
[61] Formula_1.2-4       TH.data_1.1-0       RColorBrewer_1.1-2  tools_4.1.2         bit64_4.0.5        
[66] glue_1.5.0          purrr_0.3.4         jpeg_0.1-9          parallel_4.1.2      fastmap_1.1.0      
[71] survival_3.2-13     colorspace_2.0-2    cluster_2.1.2       knitr_1.36          modeltools_0.2-23  

我不知道这是否是您的情况,但我发现package(版本 8.0.0)无法很好地处理大量元数据。

如果您使用小标题,则某些列上可能有名称*。 实木复合地板试图存储它,但是当您尝试读取文件时,您会得到这个“超出大小限制”

  • 当我说某些列可以有名称时,我的意思是您可以发现来自 tibble 的列可以是命名向量,例如:
tibble_column = df$col1
names(tibble_column)
#> [1] "name_row1" "name_row2" "name_row3"

请注意,某些 R 函数(例如predict )可以返回命名向量,因此您可能会在不注意的情况下将这些名称添加到列中。 这并不总是一个问题,只有当您拥有庞大的数据集并且通常不止一个具有名称的列时。

您可以检查是否是这种情况: sapply(df, function(x) length(names(x))

如果您有任何大于 0 的值,那么这就是 parquet 将尝试存储的元数据。 只需为这些列设置 df$column = unname(df$column) ,您应该能够正常保存和加载文件。

PS:您也可以使用df = as.data.frame(df) 这将从列中删除所有名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM