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
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>
#> …
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.
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)
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)
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).
Téléchargez la dernière version d'Apache spark https://spark.Apache.org/downloads.html (point 3 du lien)
extraire le .tgz
fichier.
installez le package devtool
dans rstudio
install.packages('devtools')
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('.')"
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()
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.
Vous pouvez simplement utiliser le package flèche :
install.packages("arrow")
library(arrow)
read_parquet("myfile.parquet")