首页 > 解决方案 > Spark镶木地板零件编号不连续?

问题描述

我正在使用 spark 3.0 对数据进行转换和排序。让我担心的是,我将数据分成 250 个桶,排序然后保存。我在输出目录中看到的通常是 160 个文件,文件名以 part-0000-** 开头,但编号顺序不一致:

part-00000-f667f314-69f2-40d0-ba8a-b5b934650158-c000.gz.parquet
part-00002-f667f314-69f2-40d0-ba8a-b5b934650158-c000.gz.parquet
part-00005-f667f314-69f2-40d0-ba8a-b5b934650158-c000.gz.parquet

那么第 1、3 和 4 部分发生了什么?这发生在整个文件中。我是在丢失数据还是由于某种原因正在合并分区?代码是这样的:

 df = df.withColumn("bucket", F.abs(F.col("Id")) % F.lit(250))
 df = df.repartition(250,"bucket")
 df = df.sortWithinPartitions("id")
 df.write.option("compression", "gzip").parquet(outputPath)

标签: apache-sparkpysparkparquetpartition

解决方案


您需要查看 id 列的分布。在第一行中,如果 id 使用 250 进行模运算,这意味着如果值 1、3,4 等不存在,则不会创建这些 id。在下一步中,您将使用repartition函数创建 250 个分区。其中一些分区可能是空的。

您可以尝试df.repartition("bucket")创建至少 200 个分区,这是默认分区值。如果您想没有间隙,那么您可以进行计数并在此基础上使用重新分区。


推荐阅读