Сколько файлов выводит преобразование Foundry в различных комбинациях перераспределения, разбиения на разделы и группирования?

Я думаю, что понимаю, как каждое перераспределение, разбиение куста и группирование влияет на количество выходных файлов, но я не совсем понимаю взаимодействие различных функций. Может ли кто-нибудь помочь заполнить количество выходных файлов для каждой из приведенных ниже ситуаций, где я оставил пустое место? Намерение состоит в том, чтобы понять, какой правильный код для ситуации, когда у меня есть сочетание столбцов с высокой и низкой кардинальностью, которые мне нужно разделить/разделить, где у меня есть частые операции, которые фильтруют столбцы с низкой кардинальностью и объединяются в столбцы с высокой кардинальностью.

Предположим, что у нас есть фрейм данных df, который начинается с 200 входных разделов, colA имеет 10 уникальных значений, а colB имеет 1000 уникальных значений.

Сначала несколько, чтобы проверить мое понимание:

  • df.repartition(100) = 100 выходных файлов одинакового размера

  • df.repartition('colA') = 10 выходных файлов разного размера, так как каждый файл будет содержать все строки для 1 значения colA

  • df.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, чтобы воспользоваться преимуществами группировки?


person Adil B    schedule 21.09.2020    source источник


Ответы (1)


Для секционирования улья + группировки количество выходных файлов не является постоянным и будет зависеть от фактических данных входного раздела. Чтобы уточнить, скажем, df — это 200 разделов, а не 200 файлов. Выходные файлы масштабируются с количеством входных разделов, а не с количеством файлов. 200 файлов могут ввести в заблуждение, поскольку это может быть 1 раздел на 1000 разделов.

Сначала несколько, чтобы проверить мое понимание:

df.repartition(100) = 100 выходных файлов одинакового размера

df.repartition('colA') = 10 выходных файлов разного размера, так как каждый файл будет содержать все строки для 1 значения colA

df.repartition('colB') = 1000 выходных файлов

df.repartition(50, 'colA') = 50 выходных файлов

df.repartition(50, 'colB') = 50 выходных файлов

Разделы куста:

output.write_dataframe(df, partition_cols=['colA']) = верхняя граница 2000 выходных файлов (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 выходных файлов разного размера (по 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) = не более 2000 файлов (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 выходных файлов (переразметка colA, colB = 10 000 разделов, каждый раздел содержит ровно 1 colA и 1 ведро colB)

person Andrew St P    schedule 21.09.2020