用SparkR编写分区的镶木地板文件

时间:2019-06-13 11:56:51

标签: r apache-spark sparkr

我有两个使用输出的脚本,一个在R中,另一个在pyspark中很短。为了简化起见,我正在尝试将该功能复制到第一个脚本中。

第二个脚本非常简单-读取一堆csv文件并将其作为分区拼花板发出:

spark.read.csv(path_to_csv, header = True) \
     .repartition(partition_column).write \
     .partitionBy(partition_column).mode('overwrite') \
     .parquet(path_to_parquet)

这在R中应该同样简单,但是我不知道如何匹配partitionBy中的SparkR功能。到目前为止,我已经知道了:

library(SparkR); library(magrittr)
read.df(path_to_csv, 'csv', header = TRUE) %>%
  repartition(col = .$partition_column) %>%
  write.df(path_to_parquet, 'parquet', mode = 'overwrite')

此操作成功为每个partition_column值写入一个实木复合地板文件。问题是发出的文件目录结构错误;而Python产生类似

/path/to/parquet/
  partition_column=key1/
    file.parquet.gz
  partition_column=key2/
    file.parquet.gz
  ...

R仅产生

/path/to/parquet/
  file_for_key1.parquet.gz
  file_for_key2.parquet.gz
  ...

我想念什么吗? partitionBy中的SparkR函数仅是指窗口函数的上下文,我在手册中看不到其他可能相关的内容。也许有一种方法可以在...中传递内容,但是我在文档中或在线搜索中都看不到任何示例。

1 个答案:

答案 0 :(得分:1)

Spark <= 2.x不支持对输出进行分区。

但是,它将在SparR> = 3.0.0(SPARK-21291 - R partitionBy API)中受支持,语法如下:

write.df(
  df, path_to_csv, "parquet", mode = "overwrite",
  partitionBy = "partition_column"
)

由于corresponding PR仅修改R文件,因此如果不能升级到开发版本,则应该可以修补任何SparkR 2.x发行版:

git clone https://github.com/apache/spark.git
git checkout v2.4.3  # Or whatever branch you use
# https://github.com/apache/spark/commit/cb77a6689137916e64bc5692b0c942e86ca1a0ea
git cherry-pick cb77a6689137916e64bc5692b0c942e86ca1a0ea
R -e "devtools::install('R/pkg')"

在客户端模式下,仅在驱动程序节点上才需要。

但这不是致命的,也不应该引起任何严重的问题。