Foundry Transform 在重新分区、配置单元分区和分桶的各种组合中输出了多少文件?
How many files are output by a Foundry Transform in various combinations of repartition, hive partitioning, and bucketing?
我想我了解重新分区、配置单元分区和分桶如何影响输出文件的数量,但我不太清楚各种功能之间的相互作用。有人可以帮助填写以下每种情况下我留空的输出文件的数量吗?目的是了解在我混合使用高基数列和低基数列的情况下,正确的代码是什么,我需要根据这些列进行分区/存储,在这种情况下,我经常对低基数列进行过滤,并加入高基数列。
假设我们有一个以 200 个输入分区开始的数据框 df
,colA
有 10 个唯一值,colB
有 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 个输出文件,因此某些文件将包含多个 colB 值?
Hive 分区:
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个不同大小的输出文件(每个hive分区1个文件)
分桶:
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_cols=[‘colA’], bucket_count=10)
= ???
现在一起:
output.write_dataframe(df, partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= ???
output.write_dataframe(df.repartition(‘colA’, ‘colB’), partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= ??? -- 这是我最终要使用的命令吗?下游的任何内容都将首先过滤 colA 以利用配置单元分区,然后加入 colB 以利用分桶?
对于 hive 分区 + 分桶,输出文件的数量不是恒定的,将取决于输入的实际数据 partition.To 澄清一下,假设 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 个输出文件
Hive 分区:
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个不同大小的输出文件(每个hive分区1个文件)
分桶:
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_cols=[‘colA’], bucket_count=10)
= 恰好 10 个文件(重新分区的数据集有 10 个输入分区,每个分区只输出到 1 个桶)
现在一起:
output.write_dataframe(df, partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= 我可能错了,但我相信最多 400,000 个输出文件(200 个输入分区 * 10 个 colA 分区 * 200 个 colB 桶)
output.write_dataframe(df.repartition(‘colA’, ‘colB’), partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= 我相信这正好是 10,000 个输出文件(repartition colA,colB = 10,000 个分区,每个分区恰好包含 1 个 colA 和 1 个 colB 桶)
我想我了解重新分区、配置单元分区和分桶如何影响输出文件的数量,但我不太清楚各种功能之间的相互作用。有人可以帮助填写以下每种情况下我留空的输出文件的数量吗?目的是了解在我混合使用高基数列和低基数列的情况下,正确的代码是什么,我需要根据这些列进行分区/存储,在这种情况下,我经常对低基数列进行过滤,并加入高基数列。
假设我们有一个以 200 个输入分区开始的数据框 df
,colA
有 10 个唯一值,colB
有 1000 个唯一值。
先说几句来检查我的理解:
df.repartition(100)
= 100 个相同大小的输出文件
的 1 个值的所有行df.repartition('colA')
= 10 个不同大小的输出文件,因为每个文件将包含 colAdf.repartition('colB')
= 1000 个输出文件df.repartition(50, 'colA')
= 50 个输出文件?df.repartition(50, 'colB')
= 50 个输出文件,因此某些文件将包含多个 colB 值?
Hive 分区:
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个不同大小的输出文件(每个hive分区1个文件)
分桶:
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_cols=[‘colA’], bucket_count=10)
= ???
现在一起:
output.write_dataframe(df, partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= ???output.write_dataframe(df.repartition(‘colA’, ‘colB’), partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= ??? -- 这是我最终要使用的命令吗?下游的任何内容都将首先过滤 colA 以利用配置单元分区,然后加入 colB 以利用分桶?
对于 hive 分区 + 分桶,输出文件的数量不是恒定的,将取决于输入的实际数据 partition.To 澄清一下,假设 df 是 200 个分区,而不是 200 个文件。输出文件根据输入分区的数量而不是文件的数量进行缩放。 200 个文件可能会产生误导,因为这可能是 1 个分区到 1000 个分区。
先来几张来验证我的理解:
df.repartition(100)
= 100 个相同大小的输出文件
df.repartition('colA')
= 10 个不同大小的输出文件,因为每个文件将包含 colA
df.repartition('colB')
= 1000 个输出文件
df.repartition(50, 'colA')
= 50 个输出文件
df.repartition(50, 'colB')
= 50 个输出文件
Hive 分区:
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个不同大小的输出文件(每个hive分区1个文件)
分桶:
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_cols=[‘colA’], bucket_count=10)
= 恰好 10 个文件(重新分区的数据集有 10 个输入分区,每个分区只输出到 1 个桶)
现在一起:
output.write_dataframe(df, partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= 我可能错了,但我相信最多 400,000 个输出文件(200 个输入分区 * 10 个 colA 分区 * 200 个 colB 桶)
output.write_dataframe(df.repartition(‘colA’, ‘colB’), partition_cols=[‘colA’], bucket_cols=[‘colB’], bucket_count=200)
= 我相信这正好是 10,000 个输出文件(repartition colA,colB = 10,000 个分区,每个分区恰好包含 1 个 colA 和 1 个 colB 桶)