如何读取 R 中的 Parquet 并将其转换为 R DataFrame?
How do I read a Parquet in R and convert it to an R DataFrame?
我想用 R 编程语言处理 Apache Parquet 个文件(在我的例子中,是在 Spark 中生成的)。
R reader 可用吗?或者正在做一个工作?
如果没有,到达那里最方便的方法是什么?注意:有Java和C++绑定:https://github.com/apache/parquet-mr
如果您使用的是 Spark,那么随着 Spark 1.4 的发布,这现在相对简单了,请参阅下面的示例代码,该代码使用现在成为 Apache Spark 核心框架一部分的 SparkR 包。
# 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()
显示扩展示例@
https://gist.github.com/andyjudson/6aeff07bbe7e65edc665
如果您不使用 Spark,我不知道您可以使用任何其他软件包。
要读取 Amazon S3 存储桶中的镶木地板文件,请尝试使用 s3a 而不是 s3n。在使用 EMR 1.4.0、RStudio 和 Spark 1.5.0 读取镶木地板文件时,这对我有用。
替代 SparkR
,您现在可以使用 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)
Spark 已更新,有许多新事物和功能已被弃用或重命名。
Andy 上面的回答适用于 spark v.1.4,但在 spark v.2.3 上,这是对我有用的更新。
下载最新版本的apache spark
https://spark.apache.org/downloads.html(link中的第 3 点)
提取 .tgz
文件。
在rstudio
中安装devtool
包
install.packages('devtools')
打开 terminal
并按照以下步骤操作
# 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('.')"
返回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()
通过 reticulate,您可以使用 pandas 从 python 到 parquet 文件。这可以为您省去 运行 个 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)
您可以为此使用 arrow
包。它与 Python pyarrow
中的相同,但现在也为 R 打包,而不需要 Python.
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
然后你可以安装Rarrow
包:
devtools::install_github("apache/arrow/r")
并用它加载 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>
#> …
您可以简单地使用 arrow package:
install.packages("arrow")
library(arrow)
read_parquet("myfile.parquet")
miniparquet
是一个新的专用包。安装:
devtools::install_github("hannesmuehleisen/miniparquet")
文档中的示例:
library(miniparquet)
f <- system.file("extdata/userdata1.parquet", package="miniparquet")
df <- parquet_read(f)
str(df)
# 'data.frame': 1000 obs. of 13 variables:
# $ registration_dttm: POSIXct, format: "2016-02-03 07:55:29" "2016-02-03 17:04:03" "2016-02-03 01:09:31" ...
# $ id : int 1 2 3 4 5 6 7 8 9 10 ...
# $ first_name : chr "Amanda" "Albert" "Evelyn" "Denise" ...
# $ last_name : chr "Jordan" "Freeman" "Morgan" "Riley" ...
# $ email : chr "ajordan0@com.com" "afreeman1@is.gd" "emorgan2@altervista.org" "driley3@gmpg.org" ...
# $ gender : chr "Female" "Male" "Female" "Female" ...
# $ ip_address : chr "1.197.201.2" "218.111.175.34" "7.161.136.94" "140.35.109.83" ...
# $ cc : chr "6759521864920116" "" "6767119071901597" "3576031598965625" ...
# $ country : chr "Indonesia" "Canada" "Russia" "China" ...
# $ birthdate : chr "3/8/1971" "1/16/1968" "2/1/1960" "4/8/1997" ...
# $ salary : num 49757 150280 144973 90263 NA ...
# $ title : chr "Internal Auditor" "Accountant IV" "Structural Engineer" "Senior Cost Accountant" ...
# $ comments : chr "1E+02" "" "" "" ...
如果您有 multi-file 镶木地板文件,您可能需要执行如下操作:
data.table::rbindlist(lapply(Sys.glob("path_to_parquet/part-*.parquet"), arrow::read_parquet))
我想用 R 编程语言处理 Apache Parquet 个文件(在我的例子中,是在 Spark 中生成的)。
R reader 可用吗?或者正在做一个工作?
如果没有,到达那里最方便的方法是什么?注意:有Java和C++绑定:https://github.com/apache/parquet-mr
如果您使用的是 Spark,那么随着 Spark 1.4 的发布,这现在相对简单了,请参阅下面的示例代码,该代码使用现在成为 Apache Spark 核心框架一部分的 SparkR 包。
# 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()
显示扩展示例@ https://gist.github.com/andyjudson/6aeff07bbe7e65edc665
如果您不使用 Spark,我不知道您可以使用任何其他软件包。
要读取 Amazon S3 存储桶中的镶木地板文件,请尝试使用 s3a 而不是 s3n。在使用 EMR 1.4.0、RStudio 和 Spark 1.5.0 读取镶木地板文件时,这对我有用。
替代 SparkR
,您现在可以使用 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)
Spark 已更新,有许多新事物和功能已被弃用或重命名。
Andy 上面的回答适用于 spark v.1.4,但在 spark v.2.3 上,这是对我有用的更新。
下载最新版本的apache spark https://spark.apache.org/downloads.html(link中的第 3 点)
提取
.tgz
文件。在
中安装rstudio
devtool
包install.packages('devtools')
打开
terminal
并按照以下步骤操作# 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('.')"
返回
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()
通过 reticulate,您可以使用 pandas 从 python 到 parquet 文件。这可以为您省去 运行 个 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)
您可以为此使用 arrow
包。它与 Python pyarrow
中的相同,但现在也为 R 打包,而不需要 Python.
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
然后你可以安装Rarrow
包:
devtools::install_github("apache/arrow/r")
并用它加载 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>
#> …
您可以简单地使用 arrow package:
install.packages("arrow")
library(arrow)
read_parquet("myfile.parquet")
miniparquet
是一个新的专用包。安装:
devtools::install_github("hannesmuehleisen/miniparquet")
文档中的示例:
library(miniparquet)
f <- system.file("extdata/userdata1.parquet", package="miniparquet")
df <- parquet_read(f)
str(df)
# 'data.frame': 1000 obs. of 13 variables:
# $ registration_dttm: POSIXct, format: "2016-02-03 07:55:29" "2016-02-03 17:04:03" "2016-02-03 01:09:31" ...
# $ id : int 1 2 3 4 5 6 7 8 9 10 ...
# $ first_name : chr "Amanda" "Albert" "Evelyn" "Denise" ...
# $ last_name : chr "Jordan" "Freeman" "Morgan" "Riley" ...
# $ email : chr "ajordan0@com.com" "afreeman1@is.gd" "emorgan2@altervista.org" "driley3@gmpg.org" ...
# $ gender : chr "Female" "Male" "Female" "Female" ...
# $ ip_address : chr "1.197.201.2" "218.111.175.34" "7.161.136.94" "140.35.109.83" ...
# $ cc : chr "6759521864920116" "" "6767119071901597" "3576031598965625" ...
# $ country : chr "Indonesia" "Canada" "Russia" "China" ...
# $ birthdate : chr "3/8/1971" "1/16/1968" "2/1/1960" "4/8/1997" ...
# $ salary : num 49757 150280 144973 90263 NA ...
# $ title : chr "Internal Auditor" "Accountant IV" "Structural Engineer" "Senior Cost Accountant" ...
# $ comments : chr "1E+02" "" "" "" ...
如果您有 multi-file 镶木地板文件,您可能需要执行如下操作:
data.table::rbindlist(lapply(Sys.glob("path_to_parquet/part-*.parquet"), arrow::read_parquet))