apache-spark - 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)
解决方案
您需要查看 id 列的分布。在第一行中,如果 id 使用 250 进行模运算,这意味着如果值 1、3,4 等不存在,则不会创建这些 id。在下一步中,您将使用repartition
函数创建 250 个分区。其中一些分区可能是空的。
您可以尝试df.repartition("bucket")
创建至少 200 个分区,这是默认分区值。如果您想没有间隙,那么您可以进行计数并在此基础上使用重新分区。
推荐阅读
- android - 如何在 android 中创建如下图所示的布局以及 android 布局中的 alpha 是什么
- ruby-on-rails - 如何在 Rails 5 中全面诊断测试环境问题
- javascript - 如何使用jQuery将html表单数据插入到html表格中?
- asp.net-core - IdentityServer4 与 AspNetIdentity。如何让 WebApi 访问 UserDb
- java - 使用 itext 时出错
- html - 如何使用纯 CSS 创建带有虚线的票形状?
- html - 我基于复选框单击显示 2 个图标,但如果我选择 >1,则不应出现复选框
- java - 从 String java 中删除未知数量的字符
- node.js - nodejs - Mongoose 5.3.8 - GeoJSON 查询不起作用
- swift - BaseObject 可以有 NSObject、Mappable 和 Object swift