Я думаю, что понимаю, как каждое перераспределение, разбиение куста и группирование влияет на количество выходных файлов, но я не совсем понимаю взаимодействие различных функций. Может ли кто-нибудь помочь заполнить количество выходных файлов для каждой из приведенных ниже ситуаций, где я оставил пустое место? Намерение состоит в том, чтобы понять, какой правильный код для ситуации, когда у меня есть сочетание столбцов с высокой и низкой кардинальностью, которые мне нужно разделить/разделить, где у меня есть частые операции, которые фильтруют столбцы с низкой кардинальностью и объединяются в столбцы с высокой кардинальностью.
Предположим, что у нас есть фрейм данных df
, который начинается с 200 входных разделов, colA
имеет 10 уникальных значений, а colB
имеет 1000 уникальных значений.
Сначала несколько, чтобы проверить мое понимание:
df.repartition(100)
= 100 выходных файлов одинакового размераdf.repartition('colA')
= 10 выходных файлов разного размера, так как каждый файл будет содержать все строки для 1 значения colAdf.repartition('colB')
= 1000 выходных файловdf.repartition(50, 'colA')
= 50 выходных файлов?df.repartition(50, 'colB')
= 50 выходных файлов, поэтому некоторые файлы будут содержать более одного значения colB?
Разделы улья:
output.write_dataframe(df, partition_cols=['colA'])
= 1000 выходных файлов (потому что я получаю потенциально 100 файлов в каждом из 10 разделов куста 10)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 выходных файлов разного размера (по 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, чтобы воспользоваться преимуществами группировки?