Spark DataFrame 重新分区和 Parquet 分区

Spark DataFrame Repartition and Parquet Partition

  1. 我在列上使用重新分区将数据存储在镶木地板中。但 我看到没有。镶木地板分区文件与 不。 Rdd分区。 rdd分区之间是否没有关联 和镶木地板分区?

  2. 当我将数据写入parquet分区并使用Rdd时 重新分区,然后我从镶木地板分区读取数据,是 有任何条件时 rdd 分区号将相同 在读/写期间?

  3. 如何使用列 ID 对数据框进行分桶并重新分区 dataframe 通过相同的列 id 不同?

  4. 在考虑 Spark 中连接的性能时,我们应该 查看分桶或重新分区(或两者)

您要问的几件事 - 数据的分区、分桶和平衡,

分区:

  1. 分区数据通常用于水平分布负载,这具有性能优势,并有助于以逻辑方式组织数据。
  2. 分区表改变了持久数据的结构,现在将创建反映此分区结构的子目录。
  3. 这可以显着提高查询性能,但前提是分区方案反映了常见的过滤。

在 Spark 中,这是通过 df.write.partitionedBy(column*) 完成的,并通过将 columns 分区到同一子目录来对数据进行分组。

分桶:

  1. 分桶是另一种将数据集分解为更易于管理的部分的技术。根据提供的列,整个数据被散列到用户定义数量的桶(文件)中。
  2. Hive 的同义词 Distribute By

在 Spark 中,这是通过 df.write.bucketBy(n, column*) 完成的,并通过将 columns 分区到同一个文件来对数据进行分组。生成的文件数量由 n

控制

重新分区:

  1. 它 returns 一个新的 DataFrame 根据给定的分区表达式均匀地平衡到给定数量的内部文件中。生成的 DataFrame 是散列分区的。
  2. Spark 管理这些分区上的数据,这有助于以最小的网络流量并行化分布式数据处理,以便在执行程序之间发送数据。

在 Spark 中,这是通过 df.repartition(n, column*) 完成的,并通过将 columns 分区到同一个内部分区文件中来对数据进行分组。请注意,没有数据持久存储,这只是基于类似于 bucketBy

的约束的数据内部平衡

Tl;dr

1) 我在列上使用重新分区将数据存储在镶木地板中。但我看到没有。镶木地板分区文件的数量与编号不同。 Rdd分区。难道rdd分区和parquet分区没有关联吗?

  • repartition 与 bucketBy 相关,而不是 partitionedBy。分区文件由 spark.sql.shuffle.partitionsspark.default.parallelism
  • 等其他配置管理

2) 当我将数据写入 parquet 分区并使用 Rdd 重新分区然后从 parquet 分区读取数据时,是否存在读取期间 rdd 分区号相同的情况 /写?

  • 在读取期间,分区数将等于spark.default.parallelism

3) 使用列 ID 对数据帧进行分桶和通过同一列 ID 对数据帧重新分区有何不同?

  • 工作方式类似,不同的是,存储桶是一个写入操作,用于持久化。

4) 在考虑 Spark 中连接的性能时,我们是否应该考虑分桶或重新分区(或两者)

  • repartition 两个数据集都在内存中,如果一个或两个数据集被持久化,那么还要查看 bucketBy