Выровнять разбиение набора данных по схеме разбиения таблицы - PullRequest
1 голос
/ 19 апреля 2020

Я пишу в таблицу, разбитую по месяцам. Я знаю, что мои данные составляют ≈100 МБ на раздел, нет перекоса - они поместятся в одном блоке HDFS, и я хочу убедиться, что каждый раздел получает один записанный файл. Я также знаю точное количество месяцев в моем наборе данных (что-то между 1 и 10), поэтому:

ds.repartition(nMonths, $"month").write.<options>.insertInto(<...>)

Это работает. Однако я думаю отсюда ... Поскольку Spark использует ключ ha sh для определения раздела, я не гарантирую, что каждый раздел получит данные за один месяц. Чем больше разделов у меня есть, тем меньше вероятность того, что это на самом деле - верно?

Имеет ли смысл тогда увеличивать количество разделов выше количества различных ключей?

ds.repartition(nMonths * 3, $"month").write.<options>.insertInto(<...>)

Много разделов будет пустым, но это не должно быть такой большой проблемой (не так ли?), и мы уменьшаем вероятность того, что некоторые неудачные разделы получат данные 3x / 4x, увеличив общее время выполнения. Имеет ли это смысл? Есть ли эмпирическое правило относительно фактора? Или любой другой подход для достижения того же?

1 Ответ

1 голос
/ 20 апреля 2020

Если вы хотите быть супер-безопасным, вы можете использовать диапазонное разбиение , что-то вроде:

ds.repartitionByRange(nMonths,$"month").write...

Таким образом, у вас также не будет пустых разделов, что, в свою очередь, означает, что вы не будете создавать файлы нулевого размера и в HDFS.

...