使用SparkR编写分区拼花地板文件

使用SparkR编写分区拼花地板文件,r,apache-spark,sparkr,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

我有两个脚本,一个在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中应该同样简单,但我不知道如何匹配
SparkR
中的
partitionBy
功能。到目前为止,我已经做到了:

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\u列的每个值写入一个拼花文件。问题是发出的文件具有错误的目录结构;而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
  ...

我错过什么了吗?
SparkR
中的
partitionBy
功能仅用于参考窗口功能的上下文,我在手册中没有看到任何其他相关内容。也许有一种方法可以在
中传递某些内容,但我在文档或在线搜索中没有看到任何示例。

Spark=3.0.0()中不支持输出分区,语法如下:

write.df(
  df, path_to_csv, "parquet", mode = "overwrite",
  partitionBy = "partition_column"
)
由于只修改R文件,如果不选择升级到开发版本,您应该能够修补任何SparkR 2.x发行版:

git克隆https://github.com/apache/spark.git
git checkout v2.4.3或您使用的任何分支
# https://github.com/apache/spark/commit/cb77a6689137916e64bc5692b0c942e86ca1a0ea
吉特樱桃采摘cb77a6689137916e64bc5692b0c942e86ca1a0ea
R-e“devtools::install('R/pkg')”
在客户端模式下,这应该仅在驱动程序节点上需要


但是这些都不是致命的,也不会引起任何严重的问题。

看起来按参数划分的问题是在7个月前解决的?我不在我的机器上,所以我不能检查释放。。。
partitionBy
参数不在最新版本中?(顺便说一句,我正在研究2.3.1)事实并非如此。修复版本为3.0,最新版本为2.4.3。谢谢。只要看一眼公共关系就知道这是可行的。。。稍后再测试是的,这很容易做到。我已经编辑了答案,添加了说明。哦,实际上我指的是一些更少涉及的内容。从字面上说,只需复制粘贴,然后拉出
callJMethod=SparkR:::callJMethod
和同上
setWriteOptions
handledCallJMethod
,它甚至无需更新包即可工作