只读 R 中的镶木地板列名称

Read only parquet column names in R

我希望使用 R 中的箭头包从镶木地板文件(带分区)中仅获取列名。我希望有一个仅包含列名的向量。我可以使用 collect 来做到这一点,但是使用更大的多分区和多文件镶木地板需要比预期更长的时间。这是我所拥有并希望实现的一个例子。

创建带分区的parquet(有些可能有多个分区)

arrow::write_dataset(mtcars, "C:/Data/parquet/mtcars", format = "parquet", partitioning = c("cyl"))

当前获取 parquet 列名称的方法

colnames(arrow::open_dataset(sources = "C:/Data/parquet/mtcars") %>%
  dplyr::collect())

使用 colnames 和 collect 的结果

[1] "mpg"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb" "cyl"

我觉得有一种更有效的方法可以在不进行收集的情况下获取 parquet 列名称。最终目标是拥有一个像上面那样的向量。接受各种选择和想法。

parquet 文件也可以用 lapplyrbindlist 读取,例如

data.table::rbindlist(lapply(Sys.glob("C:/Data/parquet/mtcars/*/part-*.parquet"), arrow::read_parquet)) %>% colnames

但是 open_datasetcollect 似乎效率更高。

根据 documentation, the Dateset object has got a schema method from which you can get the columns names.

我觉得应该是这样的:

arrow::open_dataset(sources = "C:/Data/parquet/mtcars")$schema$names

这只会加载数据集的元数据,应该比加载所有数据快得多。

如果您使用的是单个文件 parquet,那么 R-arrow 库中存在的函数的以下包装函数将适用于您:

read_parquet_schema <- function (file, col_select = NULL, as_data_frame = TRUE, props = ParquetArrowReaderProperties$create(), 
                                 ...) 
{
  require(arrow)
  reader <- ParquetFileReader$create(file, props = props, ...)
  schema <- reader$GetSchema()
  names <- names(schema)
  return(names)
}

示例:

arrow::write_parquet(iris,"iris.parquet")
read_parquet_schema("iris.parquet")
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"