【发布时间】:2018-07-05 23:44:56
【问题描述】:
在我的 R 脚本中,我有一个 SparkDataFrame 两列(时间、值),其中包含四个不同月份的数据。因为我需要将我的函数分别应用到每个月,所以我想我会将 repartition 它分成四个分区,每个分区分别保存一个月的数据。
我创建了一个名为 partition 的附加列,具有一个整数值 0 - 3,然后通过该特定列调用 repartition 方法。
遗憾的是,正如本主题中所描述的那样:
Spark SQL - Difference between df.repartition and DataFrameWriter partitionBy?,通过repartition 方法,我们只能确定所有具有相同键的数据最终会在同一个分区中,但是具有不同键的数据也可以最终在同一个分区中。
在我的例子中,执行下面可见的代码会导致创建 4 个分区,但只用数据填充其中的 2 个。
我想我应该使用partitionBy 方法,但是对于 SparkR,我不知道该怎么做。
官方文档指出,此方法适用于名为 WindowSpec 而不是 DataFrame 的东西。
我非常感谢您对此事的帮助,因为我不知道如何将此方法合并到我的代码中。
sparkR.session(
master="local[*]", sparkConfig = list(spark.sql.shuffle.partitions="4"))
df <- as.DataFrame(inputDat) # this is a dataframe with added partition column
repartitionedDf <- repartition(df, col = df$partition)
schema <- structType(
structField("time", "timestamp"),
structField("value", "double"),
structField("partition", "string"))
processedDf <- dapply(repartitionedDf,
function(x) { data.frame(produceHourlyResults(x), stringsAsFactors = FALSE) },
schema)
【问题讨论】:
标签: r apache-spark sparkr