我们都知道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帖子: