Прочитать каталог секционированного паркета (все файлы) в одном R-кадре данных с помощью стрелки apache - PullRequest
0 голосов
/ 17 октября 2019

Как мне прочитать разделенный файл паркета в R со стрелкой (без искры)

Ситуация

  1. созданные файлы паркета с помощью трубы Sparkи сохранить на S3
  2. для чтения с RStudio / RShiny с одним столбцом в качестве индекса для дальнейшего анализа

Структура файла паркета

файлы паркета, созданные из моего Spark, состоят из нескольких частей

tree component_mapping.parquet/
component_mapping.parquet/
├── _SUCCESS
├── part-00000-e30f9734-71b8-4367-99c4-65096143cc17-c000.snappy.parquet
├── part-00001-e30f9734-71b8-4367-99c4-65096143cc17-c000.snappy.parquet
├── part-00002-e30f9734-71b8-4367-99c4-65096143cc17-c000.snappy.parquet
├── part-00003-e30f9734-71b8-4367-99c4-65096143cc17-c000.snappy.parquet
├── part-00004-e30f9734-71b8-4367-99c4-65096143cc17-c000.snappy.parquet
├── etc

Как мне прочитать этот component_mapping.parquet в R?

Что я пробовал

install.packages("arrow")
library(arrow)
my_df<-read_parquet("component_mapping.parquet")

, но это не с ошибкой

IOError: Cannot open for reading: path 'component_mapping.parquet' is a directory

Это работает, если я просто читаю один файл каталога

install.packages("arrow")
library(arrow)
my_df<-read_parquet("component_mapping.parquet/part-00000-e30f9734-71b8-4367-99c4-65096143cc17-c000.snappy.parquet")

, но мне нужно загрузить все для запросаэто

То, что я нашел в документации

В документации Apache Arrow https://arrow.apache.org/docs/r/reference/read_parquet.html и https://arrow.apache.org/docs/r/reference/ParquetReaderProperties.html Я обнаружил, что есть некоторые свойствадля команды read_parquet (), но я не могу заставить ее работать и не могу найти никаких примеров.

read_parquet(file, col_select = NULL, as_data_frame = TRUE, props = ParquetReaderProperties$create(), ...)

Как мне это сделать? установить свойства правильно, чтобы прочитать полный каталог?

# should be this methods
$read_dictionary(column_index)
or
$set_read_dictionary(column_index, read_dict)

Помощь будет очень признателен

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Чтение каталога файлов - это не то, чего вы можете достичь, установив опцию для (одного) считывателя файлов. Если с памятью нет проблем, сегодня вы можете lapply / map поверх списка каталогов и rbind / bind_rows в одном data.frame. Вероятно, есть функция purrr, которая делает это чисто. В этой итерации файлов вы также можете выбрать / отфильтровать каждый из них, если вам нужен только известный поднабор данных.

В проекте Arrow мы активно разрабатываем API многофайлового набора данных, который будетПозволяет вам делать то, что вы пытаетесь сделать, а также нажимать вниз выбор строки и столбца для отдельных файлов и многое другое. Оставайтесь с нами.

0 голосов
/ 19 октября 2019

Решение для: Считайте разделенные файлы паркета из S3 в R-кадр данных, используя стрелку

Поскольку мне потребовалось очень много времени, чтобы найти решение, и я не смог ничего найти вВ Интернете я хотел бы поделиться этим решением о том, как читать разделенные файлы паркета из S3

library(arrow)
library(aws.s3)

bucket="mybucket"
prefix="my_prefix"

# using aws.s3 library to get all "part-" files (Key) for one parquet folder from a bucket for a given prefix pattern for a given component
files<-rbindlist(get_bucket(bucket = bucket,prefix=prefix))$Key

# apply the aws.s3::s3read_using function to each file using the arrow::read_parquet function to decode the parquet format
data <- lapply(files, function(x) {s3read_using(FUN = arrow::read_parquet, object = x, bucket = bucket)})

# concatenate all data together into one data.frame
data <- do.call(rbind, data)

What a mess but it works.
@neal-richardson is there a using arrow directly to read from S3? I couldn't find something in the documentation for R
0 голосов
/ 18 октября 2019

Решение для: считывания разделенных файлов паркета из локальной файловой системы в R-кадр данных со стрелкой

Поскольку я хотел бы избежать использования Spark или Python на сервере RShiny, я не могуиспользуйте другие библиотеки, такие как sparklyr, SparkR или reticulate и dplyr, как описано, например, в Как мне прочитать паркет в R и преобразовать его в R DataFrame?

Я решил свою задачу сейчас с вашим предложением, используя arrow вместе с lapply и rbindlist

my_df <-data.table::rbindlist(lapply(Sys.glob("component_mapping.parquet/part-*.parquet"), arrow::read_parquet))

, ожидая, пока не станет доступна функция стрелки apache. Спасибо

...