Подтвердить что ты не робот

Как прочитать паркет в R и преобразовать его в R DataFrame?

Я хотел бы обработать файлы Apache Parquet (в моем случае, сгенерированный в Spark) на языке программирования R.

Доступен ли считыватель R? Или работа выполняется на одном?

Если нет, то какой из них был бы наиболее целесообразным? Примечание. Существуют привязки Java и С++: https://github.com/apache/parquet-mr

4b9b3361

Ответ 1

Вы можете использовать пакет arrow для этого. Это то же самое, что и в Python pyarrow, но в настоящее время это также поставляется в комплекте с R без использования Python. Поскольку он еще не доступен в CRAN, сначала вам нужно установить 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

Затем вы можете установить пакет R arrow:

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>
#> …

Ответ 2

Если вы используете Spark, то это относительно просто с выпуском Spark 1.4, см. пример кода ниже, который использует пакет SparkR, который теперь является частью основной инфраструктуры Apache Spark.

# 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.

Ответ 3

В качестве альтернативы 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)

Ответ 4

С сеткой вы можете использовать панд из питона для создания паркетных файлов. Это может избавить вас от необходимости запускать инстанс искры.

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

Spark был обновлен, и есть много новых вещей и функций, которые устарели или переименованы.

Ответ энди выше работает для spark v.1.4, но на spark v.2.3 это обновление, где оно работало для меня.

  1. Скачать последнюю версию apache spark https://spark.apache.org/downloads.html (пункт 3 в ссылке)

  2. распакуйте файл .tgz.

  3. установить пакет devtool в rstudio

    install.packages('devtools')
    
  4. Откройте 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('.')"
    
  5. Вернитесь к 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()
    

Ответ 6

Для чтения файла паркета в ведро Amazon S3 попробуйте использовать s3a вместо s3n. Это работало для меня при чтении паркетных файлов с использованием EMR 1.4.0, RStudio и Spark 1.5.0.

Ответ 7

Вы можете просто использовать пакет со стрелкой:

install.packages("arrow")
library(arrow)
read_parquet("myfile.parquet")

Ответ 8

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  "[email protected]" "[email protected]" "[email protected]" "[email protected]" ...
#  $ 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" "" "" "" ...