Spark DataFrame 重新分区和 Parquet 分区
Spark DataFrame Repartition and Parquet Partition
我在列上使用重新分区将数据存储在镶木地板中。但
我看到没有。镶木地板分区文件与
不。 Rdd分区。 rdd分区之间是否没有关联
和镶木地板分区?
当我将数据写入parquet分区并使用Rdd时
重新分区,然后我从镶木地板分区读取数据,是
有任何条件时 rdd 分区号将相同
在读/写期间?
如何使用列 ID 对数据框进行分桶并重新分区
dataframe 通过相同的列 id 不同?
在考虑 Spark 中连接的性能时,我们应该
查看分桶或重新分区(或两者)
您要问的几件事 - 数据的分区、分桶和平衡,
分区:
- 分区数据通常用于水平分布负载,这具有性能优势,并有助于以逻辑方式组织数据。
- 分区表改变了持久数据的结构,现在将创建反映此分区结构的子目录。
- 这可以显着提高查询性能,但前提是分区方案反映了常见的过滤。
在 Spark 中,这是通过 df.write.partitionedBy(column*)
完成的,并通过将 columns
分区到同一子目录来对数据进行分组。
分桶:
- 分桶是另一种将数据集分解为更易于管理的部分的技术。根据提供的列,整个数据被散列到用户定义数量的桶(文件)中。
- Hive 的同义词
Distribute By
在 Spark 中,这是通过 df.write.bucketBy(n, column*)
完成的,并通过将 columns
分区到同一个文件来对数据进行分组。生成的文件数量由 n
控制
重新分区:
- 它 returns 一个新的
DataFrame
根据给定的分区表达式均匀地平衡到给定数量的内部文件中。生成的 DataFrame 是散列分区的。
- Spark 管理这些分区上的数据,这有助于以最小的网络流量并行化分布式数据处理,以便在执行程序之间发送数据。
在 Spark 中,这是通过 df.repartition(n, column*)
完成的,并通过将 columns
分区到同一个内部分区文件中来对数据进行分组。请注意,没有数据持久存储,这只是基于类似于 bucketBy
的约束的数据内部平衡
Tl;dr
1) 我在列上使用重新分区将数据存储在镶木地板中。但我看到没有。镶木地板分区文件的数量与编号不同。 Rdd分区。难道rdd分区和parquet分区没有关联吗?
- repartition 与 bucketBy 相关,而不是 partitionedBy。分区文件由
spark.sql.shuffle.partitions
和 spark.default.parallelism
等其他配置管理
2) 当我将数据写入 parquet 分区并使用 Rdd 重新分区然后从 parquet 分区读取数据时,是否存在读取期间 rdd 分区号相同的情况 /写?
- 在读取期间,分区数将等于
spark.default.parallelism
3) 使用列 ID 对数据帧进行分桶和通过同一列 ID 对数据帧重新分区有何不同?
- 工作方式类似,不同的是,存储桶是一个写入操作,用于持久化。
4) 在考虑 Spark 中连接的性能时,我们是否应该考虑分桶或重新分区(或两者)
repartition
两个数据集都在内存中,如果一个或两个数据集被持久化,那么还要查看 bucketBy
。
我在列上使用重新分区将数据存储在镶木地板中。但 我看到没有。镶木地板分区文件与 不。 Rdd分区。 rdd分区之间是否没有关联 和镶木地板分区?
当我将数据写入parquet分区并使用Rdd时 重新分区,然后我从镶木地板分区读取数据,是 有任何条件时 rdd 分区号将相同 在读/写期间?
如何使用列 ID 对数据框进行分桶并重新分区 dataframe 通过相同的列 id 不同?
在考虑 Spark 中连接的性能时,我们应该 查看分桶或重新分区(或两者)
您要问的几件事 - 数据的分区、分桶和平衡,
分区:
- 分区数据通常用于水平分布负载,这具有性能优势,并有助于以逻辑方式组织数据。
- 分区表改变了持久数据的结构,现在将创建反映此分区结构的子目录。
- 这可以显着提高查询性能,但前提是分区方案反映了常见的过滤。
在 Spark 中,这是通过 df.write.partitionedBy(column*)
完成的,并通过将 columns
分区到同一子目录来对数据进行分组。
分桶:
- 分桶是另一种将数据集分解为更易于管理的部分的技术。根据提供的列,整个数据被散列到用户定义数量的桶(文件)中。
- Hive 的同义词
Distribute By
在 Spark 中,这是通过 df.write.bucketBy(n, column*)
完成的,并通过将 columns
分区到同一个文件来对数据进行分组。生成的文件数量由 n
重新分区:
- 它 returns 一个新的
DataFrame
根据给定的分区表达式均匀地平衡到给定数量的内部文件中。生成的 DataFrame 是散列分区的。 - Spark 管理这些分区上的数据,这有助于以最小的网络流量并行化分布式数据处理,以便在执行程序之间发送数据。
在 Spark 中,这是通过 df.repartition(n, column*)
完成的,并通过将 columns
分区到同一个内部分区文件中来对数据进行分组。请注意,没有数据持久存储,这只是基于类似于 bucketBy
Tl;dr
1) 我在列上使用重新分区将数据存储在镶木地板中。但我看到没有。镶木地板分区文件的数量与编号不同。 Rdd分区。难道rdd分区和parquet分区没有关联吗?
- repartition 与 bucketBy 相关,而不是 partitionedBy。分区文件由
spark.sql.shuffle.partitions
和spark.default.parallelism
等其他配置管理
2) 当我将数据写入 parquet 分区并使用 Rdd 重新分区然后从 parquet 分区读取数据时,是否存在读取期间 rdd 分区号相同的情况 /写?
- 在读取期间,分区数将等于
spark.default.parallelism
3) 使用列 ID 对数据帧进行分桶和通过同一列 ID 对数据帧重新分区有何不同?
- 工作方式类似,不同的是,存储桶是一个写入操作,用于持久化。
4) 在考虑 Spark 中连接的性能时,我们是否应该考虑分桶或重新分区(或两者)
repartition
两个数据集都在内存中,如果一个或两个数据集被持久化,那么还要查看bucketBy
。