web-dev-qa-db-fra.com

Comment lire un parquet en R et le convertir en R DataFrame?

Je voudrais traiter Apache Parquet fichiers (dans mon cas, générés dans Spark) dans le langage de programmation R.

Un lecteur R est-il disponible? Ou est-ce que des travaux sont effectués sur l'un d'entre eux?

Sinon, quelle serait la façon la plus rapide de s'y rendre? Remarque: il existe Java et liaisons C++: https://github.com/Apache/parquet-mr

27
metasim

Vous pouvez utiliser le package arrow pour cela. C'est la même chose que dans Python pyarrow mais cela vient aussi aujourd'hui emballé pour R sans avoir besoin de Python. Comme il n'est pas encore disponible sur CRAN, vous devez manuellement installez d'abord Arrow C++:

git clone https://github.com/Apache/arrow.git
cd arrow/cpp && mkdir release && cd release

# It is important to statically link to boost libraries
cmake .. -DARROW_PARQUET=ON -DCMAKE_BUILD_TYPE=Release -DARROW_BOOST_USE_SHARED:BOOL=Off
make install

Ensuite, vous pouvez installer le package R arrow:

devtools::install_github("Apache/arrow/r")

Et utilisez-le pour charger un fichier Parquet

library(arrow)
#> 
#> Attaching package: 'arrow'
#> The following object is masked from 'package:utils':
#> 
#>     timestamp
#> The following objects are masked from 'package:base':
#> 
#>     array, table
read_parquet("somefile.parquet", as_tibble = TRUE)
#> # A tibble: 10 x 2
#>        x       y
#>    <int>   <dbl>
#> …
8
Uwe L. Korn

Si vous utilisez Spark alors cela est maintenant relativement simple avec la sortie de Spark 1.4 voir l'exemple de code ci-dessous qui utilise le package SparkR qui fait maintenant partie de Apache Spark framework principal.

# install the SparkR package
devtools::install_github('Apache/spark', ref='master', subdir='R/pkg')

# load the SparkR package
library('SparkR')

# initialize sparkContext which starts a new Spark session
sc <- sparkR.init(master="local")

# initialize sqlContext
sq <- sparkRSQL.init(sc)

# load parquet file into a Spark data frame and coerce into R data frame
df <- collect(parquetFile(sq, "/path/to/filename"))

# terminate Spark session
sparkR.stop()

Un exemple développé est montré @ https://Gist.github.com/andyjudson/6aeff07bbe7e65edc665

Je ne connais aucun autre package que vous pourriez utiliser si vous n'utilisiez pas Spark.

27
Andy Judson

Alternativement à SparkR, vous pouvez maintenant utiliser sparklyr:

# install.packages("sparklyr")
library(sparklyr)

sc <- spark_connect(master = "local")

spark_tbl_handle <- spark_read_parquet(sc, "tbl_name_in_spark", "/path/to/parquetdir")

regular_df <- collect(spark_tbl_handle)

spark_disconnect(sc)
11
Aurèle

Avec reticulate, vous pouvez utiliser pandas from python to parquet files. Cela pourrait vous éviter d'avoir à exécuter une instance spark .

library(reticulate)
library(dplyr)
pandas <- import("pandas")
read_parquet <- function(path, columns = NULL) {

  path <- path.expand(path)
  path <- normalizePath(path)

  if (!is.null(columns)) columns = as.list(columns)

  xdf <- pandas$read_parquet(path, columns = columns)

  xdf <- as.data.frame(xdf, stringsAsFactors = FALSE)

  dplyr::tbl_df(xdf)

}

read_parquet(PATH_TO_PARQUET_FILE)
5
Jonathan

Spark a été mis à jour et de nombreuses choses et fonctions nouvelles sont obsolètes ou renommées.

La réponse d'Andy ci-dessus fonctionne pour spark v.1.4 mais sur spark v.2.3 c'est la mise à jour où cela a fonctionné pour moi).

  1. Téléchargez la dernière version d'Apache spark https://spark.Apache.org/downloads.html (point 3 du lien)

  2. extraire le .tgz fichier.

  3. installez le package devtool dans rstudio

    install.packages('devtools')
    
  4. Ouvrez terminal et suivez ces étapes

    # This is the folder of extracted spark `.tgz` of point 1 above
    export SPARK_HOME=extracted-spark-folder-path 
    cd $SPARK_HOME/R/lib/SparkR/
    R -e "devtools::install('.')"
    
  5. Revenir à rstudio

    # load the SparkR package
    library(SparkR)
    
    # initialize sparkSession which starts a new Spark session
    sc <- sparkR.session(master="local")
    
    # load parquet file into a Spark data frame and coerce into R data frame
    df <- collect(read.parquet('.parquet-file-path'))
    
    # terminate Spark session
    sparkR.stop()
    
4
Zmnako Awrahman

Pour lire un fichier parquet dans un compartiment Amazon S3, essayez d'utiliser s3a au lieu de s3n. Cela a fonctionné pour moi lors de la lecture de fichiers de parquet à l'aide d'EMR 1.4.0, RStudio et Spark 1.5.0.

2
Betsy Nichols

Vous pouvez simplement utiliser le package flèche :

install.packages("arrow")
library(arrow)
read_parquet("myfile.parquet")
2
fc9.30