问题描述
我想我了解重新分区,配置单元分区和存储分区中的每一个如何影响输出文件的数量,但是我对各种功能的交互作用尚不清楚。有人可以为我留下空白的以下每种情况填写输出文件的数量吗?目的是要了解正确的代码适用于以下情况:我需要对高基数列和低基数列进行混合/分区,并且需要频繁地对低基数列进行过滤并在高基数列。
假设我们有一个以200个输入分区开头的数据帧df
,colA
有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存储桶)