Spark数据帧按表达式重新分区与2GB限制

时间:2018-02-06 14:08:22

标签: apache-spark spark-dataframe

我们都知道spark不支持大于2GB的分区。 (当发生这种情况时,我们会得到java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE

那么,当使用df.repartition(num, $"col")通过表达式进行分区时,我们如何增加分区数?在此处,num的任何值都不会阻止在col散列到同一分区时破坏2GB限制。

数据帧不能像我们使用rdds那样拥有自定义散列分区器。我们已经做了一些努力来使用Range分区器,但这对此没有帮助。

到目前为止我发现的是使用窗口操作来生成自定义分区列:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val wSpec = Window.partitionBy("col").orderBy($"col")
val maxRecords = 100000
val tempDF = df.withColumn("hash_part", concat_ws("-", $"col", (row_number().over(wSpec) / lit(maxRecords)).cast("int")))

val out = tempDF.repartition($"hash_part").drop("hash_part")

你有更好的解决方案吗?更优雅?更高性能?

相关(但不回答)SO帖子:

0 个答案:

没有答案