Как динамически разделить данные в этом сценарии использования - PullRequest
0 голосов
/ 03 марта 2020

Я использую spark- sql -2.4.1 версии. У меня есть код что-то вроде ниже. У меня есть сценарий, как показано ниже.

val superDataset = // load the whole data set of student marks records ... assume have 10 years data
val selectedYrsDataset  = superDataset.repartition("--GivenYears--") //i.e. GivenYears are 2010,2011

One the selectedYrsDataset   I need to calculate year wise toppers  on over all country-wise, state-wise, colleage-wise.

Как использовать этот вариант использования? Есть ли возможность сделать это динамическое разделение c, т.е. в каждом новом-logi c -шаге мы соответственно добавляем еще один раздел (столбец), чтобы выполнить перераспределение для уже разбитого набора данных таким образом, чтобы избежать значительных перемешиваний.

1 Ответ

1 голос
/ 04 марта 2020

Пример кадра данных:

+----+-------+-----+-------+-----+
|year|country|state|college|marks|
+----+-------+-----+-------+-----+
|2019|  India|    A|     AC|   15|
|2019|  India|    A|     AC|   25|
|2019|  India|    A|     AC|   35|
|2019|  India|    A|     AD|   40|
|2019|  India|    B|     AC|   15|
|2019|  India|    B|     AC|   50|
|2019|  India|    B|     BC|   65|
|2019|    USA|    A|     UC|   15|
|2019|    USA|    A|     UC|   65|
|2019|    USA|    A|     UD|   45|
|2019|    USA|    B|     UC|   44|
|2019|    USA|    B|     MC|   88|
|2019|    USA|    B|     MC|   90|
|2020|  India|    A|     AC|   65|
|2020|  India|    A|     AC|   33|
|2020|  India|    A|     AC|   55|
|2020|  India|    A|     AD|   70|
|2020|  India|    B|     AC|   88|
|2020|  India|    B|     AC|   60|
|2020|  India|    B|     BC|   45|
|2020|    USA|    A|     UC|   85|
|2020|    USA|    A|     UC|   55|
|2020|    USA|    A|     UD|   32|
|2020|    USA|    B|     UC|   64|
|2020|    USA|    B|     MC|   78|
|2020|    USA|    B|     MC|   80|
+----+-------+-----+-------+-----+

Чтобы выполнить многомерное агрегирование, вы можете сделать это двумя способами: с помощью группирования наборов или с помощью свертки в Spark. Чтобы узнать больше об этой многомерной агрегации, перейдите по этой ссылке Многомерная агрегация

Решение с использованием свертки предоставляется следующим образом:

val ans_df = df.rollup("year","country","state","college").agg(max("marks").as("Marks"))

Результат:

+----+-------+-----+-------+-----+
|year|country|state|college|Marks|
+----+-------+-----+-------+-----+
|2020|  India|    A|     AC|   65|
|2019|  India|    B|     BC|   65|
|2020|  India|    B|   null|   88|
|2019|    USA|    B|     UC|   44|
|2020|  India|    B|     AC|   88|
|2020|    USA| null|   null|   85|
|2019|  India|    A|     AC|   35|
|2019|    USA|    B|     MC|   90|
|2019|  India|    A|     AD|   40|
|2019|    USA|    A|     UD|   45|
|2019|    USA| null|   null|   90|
|2020|    USA|    A|     UD|   32|
|null|   null| null|   null|   90|
|2019|    USA|    B|   null|   90|
|2020|  India| null|   null|   88|
|2019|    USA|    A|   null|   65|
|2019|  India|    B|   null|   65|
|2019|    USA|    A|     UC|   65|
|2020|  India|    B|     BC|   45|
|2020|    USA|    B|     UC|   64|
+----+-------+-----+-------+-----+

Более того, по запросу спарк гарантирует оптимальное выполнение этой операции и использует уже разбитые данные при выполнении groupBy для дополнительного столбца. Пример - при выполнении groupBy по ключу (год, страна , штат, колледж) будут использованы данные, уже сгруппированные по ключу (год, страна, штат), что позволит значительно сократить объем вычислений.

...