Foundry Transform以重新分区,配置单元分区和存储分区的各种组合输出了多少文件?

问题描述

我想我了解重新分区,配置单元分区和存储分区中的每一个如何影响输出文件数量,但是我对各种功能的交互作用尚不清楚。有人可以为我留下空白的以下每种情况填写输出文件数量吗?目的是要了解正确的代码适用于以下情况:我需要对高基数列和低基数列进行混合/分区,并且需要频繁地对低基数列进行过滤并在高基数列。

假设我们有一个以200个输入分区开头的数据帧dfcolA有10个唯一值,而colB有1000个唯一值。

首先检查一下我的理解

配置分区:

  • output.write_dataframe(df,partition_cols=['colA']) = 1,000个输出文件(因为我可能会在10个配置单元分区10中的每个分区中获得100个文件

  • output.write_dataframe(df,partition_cols=['colB']) = 10,000个输出文件

  • output.write_dataframe(df,partition_cols=['colA','colB']) = 100,000个输出文件

  • output.write_dataframe(df.repartition('colA'),partition_cols=['colA']) = 10个不同大小的输出文件(每个配置单元分区中一个文件

装箱:

  • output.write_dataframe(df,bucket_cols=[‘colB’],bucket_count=100) = 100个输出文件?在实验中,情况似乎并非如此

  • output.write_dataframe(df,bucket_cols=[‘colA’],bucket_count=10) = 10个输出文件

  • output.write_dataframe(df.repartition(‘colA’),bucket_count=10) = ???

现在在一起:

  • output.write_dataframe(df,partition_cols=[‘colA’],bucket_count=200) = ???

  • output.write_dataframe(df.repartition(‘colA’,‘colB’),bucket_count=200) = ??? -这是我最后要使用的命令吗?而下游的任何事物都将首先​​在colA上进行过滤以利用配置单元分区,然后在colB上进行连接以利用存储分区?

解决方法

对于配置单元分区+存储分区,输出文件的数量不是恒定的,将取决于输入分区的实际数据。为澄清起见,假设df是200个分区,而不是200个文件。输出文件按输入分区数(而不是文件数)缩放。 200个文件可能会引起误解,因为这可能是1个分区到1000个分区。

前几个要检查我的理解:

df.repartition(100) = 100个相同大小的输出文件

df.repartition('colA') = 10个不同大小的输出文件,因为每个文件将包含colA值为1的所有行

df.repartition('colB') = 1000个输出文件

df.repartition(50,'colA') = 50个输出文件

df.repartition(50,'colB') = 50个输出文件

配置分区:

output.write_dataframe(df,partition_cols=['colA']) = 2,000个输出文件的上限(200个输入分区*每个分区最多10个值)

output.write_dataframe(df,partition_cols=['colB']) =最多200,000个输出文件(每个分区200 * 1000个值)

output.write_dataframe(df,partition_cols=['colA','colB']) =最多2,000,000个输出文件(200个分区* 10个值* 1000个)

output.write_dataframe(df.repartition('colA'),partition_cols=['colA']) = 10个不同大小的输出文件(每个配置单元分区中一个文件)

装箱:

output.write_dataframe(df,bucket_cols=[‘colB’],bucket_count=100) =最多20,000个文件(200个分区*每个分区最多100个存储桶)

output.write_dataframe(df,bucket_cols=[‘colA’],bucket_count=10) =最多2,000个文件(200个分区*每个分区最多10个存储桶)

output.write_dataframe(df.repartition(‘colA’),bucket_count=10) =恰好10个文件(重新分区的数据集产生10个输入分区,每个分区仅输出到1个存储桶)

现在在一起:

output.write_dataframe(df,partition_cols=[‘colA’],bucket_count=200) =我对此可能是错的,但我认为最多可以输出40万个输出文件(200个输入分区* 10个colA分区* 200个colB存储桶)

output.write_dataframe(df.repartition(‘colA’,‘colB’),bucket_count=200) =我相信这恰好是10,000个输出文件(colA,colB分区= 10,000个分区,每个分区恰好包含1个colA和1个colB存储桶)