【问题标题】:Read only parquet column names in RR中的只读镶木地板列名
【发布时间】:2021-09-02 00:26:18
【问题描述】:

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

使用分区创建镶木地板(有些可能有多个分区)

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())

colname 与 collect 一起使用的结果

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

我觉得有一种更有效的方法可以在不进行收集的情况下获取 parquet 列名称。最终目标是有一个像上面这样的向量。对选项和想法持开放态度。

【问题讨论】:

    标签: r parquet


    【解决方案1】:

    根据documentation,Dateset对象有一个schema方法,可以从中获取columns names

    我认为应该是这样的:

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

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

    【讨论】:

    • 谢谢你,太好了。我找到了解决方法: colnames(as.data.frame(arrow::open_dataset(sources = "C:/Data/parquet/mtcars")[1,])) 和 Twitter 上的某个人推荐的名称(arrow::open_dataset( sources = "C:/Data/parquet/mtcars")),但您的解决方案似乎更好更快。再次感谢!
    【解决方案2】:

    parquet 文件也可以用lapplyrbindlist 类似读取

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

    但使用open_datasetcollect 似乎效率更高。

    【讨论】:

      【解决方案3】:

      如果您正在使用单个文件拼花,那么 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"  
      

      【讨论】:

        猜你喜欢
        • 2019-09-23
        • 2018-06-02
        • 2017-12-27
        • 2019-02-19
        • 2023-02-19
        • 1970-01-01
        • 2023-01-09
        • 2021-01-12
        • 2019-08-04
        相关资源
        最近更新 更多